වම්පස ඇති ශුන්‍යයන් සමඟ පූර්ණ සංඛ්‍යාවක් පෑඩ් කරන්නේ කෙසේද?


1033

ජාවා හි inta බවට පරිවර්තනය කිරීමේදී ඔබ ශුන්‍යයන් සමඟ පෑඩ් Stringතබන්නේ කෙසේද?

මම මූලික වශයෙන් බලන්නේ 9999ප්‍රමුඛ ශුන්‍යයන් (උදා. 1 = 0001) සමඟ පූර්ණ සංඛ්‍යා ඉවත් කිරීමට ය .


2
ඔව්, එච්චරයි! මගේ නරක ... මම එය මගේ දුරකථනයෙන් ටයිප් කළා. ඔබට "නව නූල්" අවශ්‍ය නොවේ: Integer.toString (num + 10000) .subString (1) ක්‍රියා කරයි.
රන්ද්‍යා

Long.valueOf ("00003400"). ToString (); Integer.valueOf ("00003400"). ToString (); ---> 3400
frekele

1
රූප සටහන සමඟ විසඳුමක් සඳහා stackoverflow.com/questions/35521278/… ද බලන්න
bvdb

9999 ට වඩා විශාල new String(Integer.toString(num + 10000)).substring(1)නම් ප්‍රවේශය පිළිබඳ ගැටළුවක් ඇත num, ijs.
Felype

Answers:


1710

මේ ආකාරයට භාවිතා කරන්න java.lang.String.format(String,Object...):

String.format("%05d", yournumber);

ෂඩ් දශම ප්රතිදානය සඳහා 5. දිග ශුන්ය-පුරවන සඳහා වෙනුවට dසමග xමෙන් "%05x".

සම්පූර්ණ ආකෘතිකරණ විකල්පයන් කොටසක් ලෙස ලේඛනගත කර ඇත java.util.Formatter.


1
String.formatC හි ඇති printf () ට සමාන විකල්ප මා බලාපොරොත්තු විය යුතුද ?
එතේෂ් චෞද්රි

13
විශාල අගයන් ලැයිස්තුවක් සඳහා ඔබට මෙය කිරීමට සිදුවුවහොත්, දශම ෆෝමැට් හි ක්‍රියාකාරීත්වය String.format () ට වඩා අවම වශයෙන් 3 ගුණයක් හොඳය. මම යම් කාර්ය සාධනයක් සුසර කරමින් සිටින අතර දෘශ්‍ය වීඑම් දෙකෙහි ධාවනය කිරීමෙන් ස්ට්‍රිං.ෆෝමැට් () ක්‍රමය මඟින් CPU වේලාව ඩෙසිමල් ෆෝමැට්.ෆෝමැට් () අනුපාතයට වඩා 3-4 ගුණයක් පමණ රැස් කරයි.
ස්ටීව් ෆර්ගියුසන්

11
ශුන්‍ය 9 ට වඩා එකතු කිරීම වැනි දෙයක් භාවිතා කරන්න%012d
මොහොමඩ් බනිසයිඩ්

2
මෙය ජාවා 5 සහ ඊට ඉහළින්. 1.4 සහ පහළ ඩෙසිමල් ෆෝමැට් සඳහා විකල්පයක් මෙහි පෙන්වා ඇති පරිදි javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
ආයුබෝවන් සගයනි! මට භාවිතා කිරීමේදී ගැටළු කිහිපයක් තිබේ:%d can't format java.lang.String arguments
හෙලියෝ සෝරස් කනිෂ්

124

ගේ ඔබ මුද්රණය කිරීමට අවශ්ය බවත් කියන්න මට ඉඩ දෙන්න 11ලෙස011

ඔබට ආකෘති පත්‍රයක් භාවිතා කළ හැකිය : "%03d".

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඔබට මෙම ආකෘතිය භාවිතා කළ හැකිය:

int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

විකල්පයක් ලෙස, සමහර ජාවා ක්‍රම මෙම ආකෘතිකරුවන්ට සෘජුවම සහය දක්වයි:

System.out.printf("%03d", a);

5
@ ඕමාර් කූහෙයි ඇත්ත වශයෙන්ම, නමුත් එය “මැජික් නියතයන්” පිටුපස ඇති හේතුව පැහැදිලි කරයි.
bvdb

හොඳ පිළිතුරක්! අදහස් දැක්වීමක් පමණක් F() ආකෘතියේ ආකෘතිය විය යුත්තේ f: String.format(...);.
ඩේවිඩ් මිගෙල්

මට ප්‍රමුඛ 0 නමුත් තවත් අකුරක් / අංකයක් එකතු කිරීමට අවශ්‍ය නොවන්නේ නම් කුමක් කළ යුතුද? ස්තූතියි
chiperortiz

1
ipchiperortiz afaik ඉහත ආකෘතිකරණ මෙවලම් සමඟ එය කළ නොහැක. එවැනි අවස්ථාවකදී, මම අවශ්‍ය ප්‍රමුඛ අක්ෂර (උදා int prefixLength = requiredTotalLength - String.valueOf(numericValue).length) ගණනය කර , පසුව අවශ්‍ය උපසර්ගය නිර්මාණය කිරීම සඳහා පුනරාවර්තන නූල් ක්‍රමයක් භාවිතා කරමි. නූල් පුනරාවර්තනය කිරීමට විවිධ ක්‍රම තිබේ, නමුත් ස්වදේශික ජාවා එකක් නොමැත, afaik: stackoverflow.com/questions/1235179/…
bvdb

115

ඔබ කිසියම් හේතුවක් නිසා පෙර 1.5 ජාවා භාවිතා කරන්නේ නම් Apache Commons Lang ක්‍රමය සමඟ උත්සාහ කළ හැකිය

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

30

මෙම උදාහරණය හමු විය ... පරීක්ෂා කරනු ඇත ...

import java.text.DecimalFormat;
class TestingAndQualityAssuranceDepartment
{
    public static void main(String [] args)
    {
        int x=1;
        DecimalFormat df = new DecimalFormat("00");
        System.out.println(df.format(x));
    }
}

මෙය පරීක්ෂා කර:

String.format("%05d",number);

දෙකම වැඩ කරයි, මගේ අරමුණු සඳහා මම සිතන්නේ String.Format වඩා හොඳ හා වඩා සංක්ෂිප්ත ය.


1
ඔව්, මම DecimalFormat යෝජනා කිරීමට යන්නේ String.format ගැන මා නොදැන සිටි නමුත් මම උෂින්ගේ පිළිතුර දුටුවෙමි. String.format අළුත් විය යුතුය.
පෝල් ටොම්බ්ලින්

.Net හැරුණු විට .Net මාර්ගය කුඩා සංඛ්‍යා සඳහා වඩාත් සුදුසු බව පෙනේ.
ඕමාර් කූහෙජි

මගේ නඩුවේදී මම පළමු විකල්පය (DecimalFormat) භාවිතා කළෙමි, මන්ද මගේ අංකය ද්විත්ව
maurnet

21

ඔබගේ නඩුවේ කාර්ය සාධනය වැදගත් නම්, String.formatශ්‍රිතයට සාපේක්ෂව අඩු පිරිවැයකින් ඔබට එය කළ හැකිය :

/**
 * @param in The integer value
 * @param fill The number of digits to fill
 * @return The given value left padded with the given number of digits
 */
public static String lPadZero(int in, int fill){

    boolean negative = false;
    int value, len = 0;

    if(in >= 0){
        value = in;
    } else {
        negative = true;
        value = - in;
        in = - in;
        len ++;
    }

    if(value == 0){
        len = 1;
    } else{         
        for(; value != 0; len ++){
            value /= 10;
        }
    }

    StringBuilder sb = new StringBuilder();

    if(negative){
        sb.append('-');
    }

    for(int i = fill; i > len; i--){
        sb.append('0');
    }

    sb.append(in);

    return sb.toString();       
}

කාර්ය සාධනය

public static void main(String[] args) {
    Random rdm;
    long start; 

    // Using own function
    rdm = new Random(0);
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        lPadZero(rdm.nextInt(20000) - 10000, 4);
    }
    System.out.println("Own function: " + ((System.nanoTime() - start) / 1000000) + "ms");

    // Using String.format
    rdm = new Random(0);        
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        String.format("%04d", rdm.nextInt(20000) - 10000);
    }
    System.out.println("String.format: " + ((System.nanoTime() - start) / 1000000) + "ms");
}

ප්‍රති ult ලය

තමන්ගේම කාර්යය: 1697ms

String.format: 38134ms


1
ඉහත සඳහන් වන්නේ ඩෙසිමල් ෆෝමැට් වේගවත් වීම ගැන ය. ඔබට ඒ පිළිබඳ සටහන් තිබේද?
පැට්රික්

Dec පැට්‍රික් සඳහා දශම ෆෝමැට් කාර්ය සාධනයද බලන්න: stackoverflow.com/questions/8553672/…
ස්ටෙෆාන්

කම්පනය! එහි ක්‍රියාකාරිත්වය එතරම් දුර්වල ලෙස ක්‍රියා කරයි. මට ශුන්‍ය පෑඩ් කිරීමට සිදු වූ අතර ඉලක්කම් 1 සිට 3 දක්වා පරාසයක තිබිය හැකි අත්සන් නොකළ තීන්ත එකතුවක් ප්‍රදර්ශනය කිරීමට මට සිදු විය. අකුණු වේගයෙන් වැඩ කිරීමට එය අවශ්‍ය විය. මම මෙම සරල ක්‍රමය භාවිතා කළෙමි: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";එය ඉතා වේගයෙන් ක්‍රියාත්මක විය (සමාවෙන්න මම එය කාලය ගත කළේ නැත!).
බුවින් ජේ

හොට්ස්පොට් හි ඉරිතැලීමක් ඇතිවීමට එය ප්‍රමාණවත් ලෙස ක්‍රියාත්මක වූ පසු කාර්ය සාධනය සැසඳෙන්නේ කෙසේද?
ෆිල්

16

ඔබට ගූගල් ගුවා භාවිතා කළ හැකිය :

මේවන්:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

නියැදි කේතය:

String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"

සටහන:

Guavaඑය ද අදාළ වන කාරණා ගොඩක් සපයයි, ඉතා ප්රයෝජනවත් පුස්තකාලය Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, ආදිය

Ref: GuavaExplained


1
නියැදි කේතයට ඉහළින් භාවිතා කිරීම පමණක් මිස නියැදි කේතය නොවේ. අදහස් දැක්වීම මෙය පිළිබිඹු කරයි, ඔබට "String myPaddedString = Strings.padStart (...)" අවශ්‍ය වේ
JoeG

2
මෙම ක්‍රමය ඇත්ත වශයෙන්ම JDK String.format / MessageFormatter / DecimalFormatter වලට වඩා හොඳ කාර්ය සාධන ප්‍රති results ල ලබා දෙයි.
rafalmag

11

මෙය උත්සාහ කරන්න:

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");

String c = df.format(9);   // Output: 0009

String a = df.format(99);  // Output: 0099

String b = df.format(999); // Output: 0999

3

ඉහත ප්‍රවේශයන් බොහොමයක් හොඳ වුවත්, සමහර විට අපට පූර්ණ සංඛ්‍යා මෙන්ම පාවෙන ද සංයුති කළ යුතුය. අපට මෙය භාවිතා කළ හැකිය, විශේෂයෙන් අපට නිශ්චිත ශුන්‍ය සංඛ්‍යාවක් වම් පසින් මෙන්ම දශම සංඛ්‍යා වල දකුණට ඇලවීමට අවශ්‍ය වූ විට.

import java.text.NumberFormat;  
public class NumberFormatMain {  

public static void main(String[] args) {  
    int intNumber = 25;  
    float floatNumber = 25.546f;  
    NumberFormat format=NumberFormat.getInstance();  
    format.setMaximumIntegerDigits(6);  
    format.setMaximumFractionDigits(6);  
    format.setMinimumFractionDigits(6);  
    format.setMinimumIntegerDigits(6);  

    System.out.println("Formatted Integer : "+format.format(intNumber).replace(",",""));  
    System.out.println("Formatted Float   : "+format.format(floatNumber).replace(",",""));  
 }    
}  

2
int x = 1;
System.out.format("%05d",x);

ඔබට ආකෘතිගත කළ පෙළ කෙලින්ම තිරය මත මුද්‍රණය කිරීමට අවශ්‍ය නම්.


1
නමුත් OP කිසි විටෙකත් එය ඉල්ලා සිටියේ නැත. අභ්‍යන්තරව String.formatහා System.out.formatඑකම java.util.Formatterක්‍රියාත්මක කිරීම අමතන්න .
bsd

... සහ System.out නැවත හරවා යැවිය හැකිය.
ෆිල්

1

ඔබට ෆෝමැටරයක් භාවිතා කිරීමට අවශ්‍යය , පහත කේතය අංක ෆෝමැට් භාවිතා කරයි

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

නිමැවුම්: 0001


1

පංති DecimalFormat භාවිතා කරන්න, එසේ:

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

පිටත : 0000811


මෙම අවස්ථාවේදී ප්‍රතිදානය 0811 වේ.
OJVM

1

මෙන්න ඔබට භාවිතා නොකර ඔබේ නූල් සංයුති කළ හැකි ආකාරය DecimalFormat.

String.format("%02d", 9)

09

String.format("%03d", 19)

019

String.format("%04d", 119)

0119


0

නිඛිල සහ නූල් සඳහා වැඩ කරන මගේ කේතය පරීක්ෂා කරන්න.

අපගේ පළමු අංකය 2 යැයි උපකල්පනය කරන්න. තවද අපට එයට ශුන්‍ය එකතු කිරීමට අවශ්‍ය වන අතර අවසාන නූලෙහි දිග 4 වනු ඇත. ඒ සඳහා ඔබට පහත කේතය භාවිතා කළ හැකිය

    int number=2;
    int requiredLengthAfterPadding=4;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);

(new char[diff])ඇයි
අයිසැක්

replace("\0", "0")කුමක්ද ... කුමක්ද
අයිසැක්

SIsaac - පළමුව මම වර්‍ග අරාවක් නිර්මාණය කළ අතර, එම වර්‍ග අරාව භාවිතා කරමින් මම නූලක් නිර්මාණය කළෙමි. ඉන්පසු මම ශුන්‍ය අක්‍ෂරය (එය වර්‍ග වර්ගයේ පෙරනිමි අගය) "0" සමඟ ආදේශ කළෙමි (එය අපට
පැඩින්

0

වම් පසින් ශුන්‍යයන් සහිත පූර්ණ සංඛ්‍යාවක් පෑඩ් කිරීමට තවත් ක්‍රමයක් මෙන්න. ඔබේ පහසුව අනුව ඔබට ශුන්‍ය ගණන වැඩි කළ හැකිය. Negative ණ සංඛ්‍යාවක් හෝ අගයකට වඩා වැඩි හෝ වින්‍යාස කර ඇති ශුන්‍යයන්ට සමාන අගයක් ලබා දීමට චෙක්පතක් එකතු කර තිබේ. ඔබේ අවශ්‍යතාවය අනුව ඔබට තවදුරටත් වෙනස් කළ හැකිය.

/**
 * 
 * @author Dinesh.Lomte
 *
 */
public class AddLeadingZerosToNum {
    
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println(getLeadingZerosToNum(0));
        System.out.println(getLeadingZerosToNum(7));
        System.out.println(getLeadingZerosToNum(13));
        System.out.println(getLeadingZerosToNum(713));
        System.out.println(getLeadingZerosToNum(7013));
        System.out.println(getLeadingZerosToNum(9999));
    }
    /**
     * 
     * @param num
     * @return
     */
    private static String getLeadingZerosToNum(int num) {
        // Initializing the string of zeros with required size
        String zeros = new String("0000");
        // Validating if num value is less then zero or if the length of number 
        // is greater then zeros configured to return the num value as is
        if (num < 0 || String.valueOf(num).length() >= zeros.length()) {
            return String.valueOf(num);
        }
        // Returning zeros in case if value is zero.
        if (num == 0) {
            return zeros;
        }
        return new StringBuilder(zeros.substring(0, zeros.length() - 
                String.valueOf(num).length())).append(
                        String.valueOf(num)).toString();
    }
}

ආදානය

0

7

13

713

7013

9999

ප්‍රතිදානය

0000

0007

0013

7013

9999


-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

මෙම ප්‍රවේශයේ ඇති එකම ගැටළුව නම්, එය ක්‍රියා කරන ආකාරය හඳුනා ගැනීමට ඔබේ සිතීමේ තොප්පිය පැළඳීමයි.


5
එකම ගැටළුව? numberwidth
Negative ණ

2
හොඳ කරුණක්. පළලෙන් කප්පාදු කරන බැවින් එය ඉල්ලා ඇති ප්‍රමාණයට වඩා වැඩි යමක් කරනු ඇතැයි මම සිතමි (එය පැහැදිලිවම ඉල්ලා නොසිටි නමුත් සාමාන්‍යයෙන් අවශ්‍ය වේ). ජාවා (සංසන්දනය කිරීමේදී වේදනාකාරී ලෙස මන්දගාමී) String.format () විචල්‍ය පළල සඳහා සහය නොදක්වන අතර පූර්ණ සංඛ්‍යා පිරිවිතර සඳහා නිරවද්‍යතාවට කිසිසේත් සහාය නොදක්වයි.
johncurrier

-2

පැකේජ අවශ්‍ය නොවේ:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

මෙය අක්ෂර තුනකට නූල් පටවන අතර හතරක් හෝ පහක් සඳහා තවත් කොටසක් එකතු කිරීම පහසුය. මෙය කිසිම ආකාරයකින් පරිපූර්ණ විසඳුමක් නොවන බව මම දනිමි (විශේෂයෙන් ඔබට විශාල පෑඩ් නූල් අවශ්‍ය නම්), නමුත් මම එයට කැමතියි.


1
හ්ම් ... මම එයට කැමතියි.
කාර්තික් චුග්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.