जावा मुद्रा संख्या प्रारूप


89

क्या दशमलव को प्रारूपित करने का एक तरीका निम्नलिखित है:

100   -> "100"  
100.1 -> "100.10"

यदि यह एक गोल संख्या है, तो दशमलव भाग को छोड़ दें। अन्यथा दो दशमलव स्थानों के साथ प्रारूपित करें।

जवाबों:


48

मुझे शक है। समस्या यह है कि 100 कभी 100 नहीं होता है यदि यह एक फ्लोट है, तो यह आम तौर पर 99.9999999999 या 100.0000001 या ऐसा ही कुछ है।

यदि आप इसे इस तरह से प्रारूपित करना चाहते हैं, तो आपको एक एप्सिलॉन को परिभाषित करना होगा, यानी एक पूर्णांक संख्या से अधिकतम दूरी, और अंतर छोटा होने पर पूर्णांक स्वरूपण का उपयोग करें, और अन्यथा एक फ्लोट।

कुछ इस तरह से करेंगी ट्रिक:

public String formatDecimal(float number) {
  float epsilon = 0.004f; // 4 tenths of a cent
  if (Math.abs(Math.round(number) - number) < epsilon) {
     return String.format("%10.0f", number); // sdb
  } else {
     return String.format("%10.2f", number); // dj_segfault
  }
}

8
माइनर नाइटपिक: एक फ्लोट ठीक 100 हो सकता है, जिसमें थोड़ा पैटर्न 0x42c80000 है।
करोल एस

2
हां, जैसा कि करोल एस द्वारा कहा गया था, कई नंबर फ्लोट्स से बिल्कुल मेल खा सकते हैं। सिर्फ सभी नंबर नहीं। 100 एक संख्या है जिसका प्रतिनिधित्व किया जा सकता है, आपको बस उन संख्याओं का हिसाब देना चाहिए जो नहीं हो सकते हैं।
csga5000

160

मैं java.text पैकेज का उपयोग करने की सलाह दूंगा:

double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);

यह स्थानीय विशिष्ट होने का अतिरिक्त लाभ है।

लेकिन, अगर आपको पूरा डॉलर मिल जाए, तो आप स्ट्रिंग को पीछे छोड़ दें।

if (moneyString.endsWith(".00")) {
    int centsIndex = moneyString.lastIndexOf(".00");
    if (centsIndex != -1) {
        moneyString = moneyString.substring(1, centsIndex);
    }
}

17
मुद्राओं का प्रतिनिधित्व करने के लिए आपको कभी भी दोहरे का उपयोग नहीं करना चाहिए। या तो लॉन्ग में कनवर्ट करें और दशमलव बिंदु को स्वयं प्रबंधित करें या BigDecimalफ़ॉर्मेटर के साथ उपयोग करें । joda-money.sourceforge.net एक बार काम पूरा करने के लिए एक अच्छी लाइब्रेरी होनी चाहिए।
गंडमपरा

5
मैं फिर से सहमत हूं: डबल! = पैसा, लेकिन यह नहीं है कि सवाल कैसे लगाया गया था।
duffymo

3
आपका क्या मतलब है कि मुद्राएँ कैसे काम करती हैं? मैं कह सकता हूं कि कुछ लागतें $ 1 नहीं $ 1.00 हैं .... मुद्राओं को प्रदर्शित करने के विभिन्न तरीके हैं (डिफ़ॉल्ट के अलावा) और यह सवाल पूछता है कि दशमलव भाग को कैसे छोड़ा जाए अगर इसकी पूरी संख्या हो।
डीडी।

1
यह एक प्रतिपादन मुद्दा है। मुद्रा को स्ट्रिंग के रूप में स्वीकार करने के लिए अपने UI में तर्क रखें और यदि यह एक सटीक डॉलर है तो दशमलव और सेंट को कम कर दें।
duffymo

2
सहमत - यही कारण है कि जब मैंने 5.5 साल पहले यह लिखा था, तो मैंने लोकेल का उपयोग करने की सिफारिश की थी। "लेकिन, अगर आपको चाहिए, ...." प्रमुख वाक्यांश है।
डफाइमो

124
double amount =200.0;
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

या

double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
        .format(amount));

मुद्रा प्रदर्शित करने का सबसे अच्छा तरीका

उत्पादन

$ 200.00

यदि आप साइन का उपयोग नहीं करना चाहते हैं तो इस विधि का उपयोग करें

double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));

200.00

यह भी इस्तेमाल किया जा सकता है (हजार विभाजक के साथ)

double amount = 2000000;    
System.out.println(String.format("%,.2f", amount));          

2,000,000.00


ऐसा लगता नहीं है कि "मुद्रा" संदर्भित है या इसे घोषित होने के बाद उपयोग किया जाता है ... क्या लाइन 3 का कोई साइड इफेक्ट है? या किसी और वजह से आपने इसे शामिल किया?
डेमियन


18

मुझे Google खोज के बाद कोई अच्छा समाधान नहीं मिला, बस अपना समाधान अन्य संदर्भ के लिए पोस्ट करें। का उपयोग priceToString प्रारूप पैसे के लिए।

public static String priceWithDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.00");
    return formatter.format(price);
}

public static String priceWithoutDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.##");
    return formatter.format(price);
}

public static String priceToString(Double price) {
    String toShow = priceWithoutDecimal(price);
    if (toShow.indexOf(".") > 0) {
        return priceWithDecimal(price);
    } else {
        return priceWithoutDecimal(price);
    }
}

उन्होंने कभी भी इसे बेहतर नहीं कहा। महामहिम ने केवल अपना समाधान पोस्ट किया ताकि अन्य लोग इसका उल्लेख कर सकें। कम से कम आप कह सकते हैं कि धन्यवाद है।
उमंग देसाई

क्या होगा यदि मैं भारतीय प्रारूप में मूल्य प्रदर्शित करना चाहता हूं। दशमलव के बिना। प्रारूप -> ##, ##, ###
भुवन

PriceWithDecimal (डबल) विधि में, "0,00" दिखाने के "###,###,###.00"लिए मास्क बदलने की कोशिश करें "###,###,##0.00"जब मान "0" हो
dellasavia

1
स्वरूपित मुद्रा को फिर से डबल
विवेक शंकर

6

हाँ। आप java.util.formatter का उपयोग कर सकते हैं । आप "% 10.2f" जैसे एक स्वरूपण स्ट्रिंग का उपयोग कर सकते हैं


String.format()उसके लिए एक अच्छा स्थिर आवरण है। यकीन नहीं है कि आप '10' का उपयोग क्यों करते हैं, हालांकि।
एक्सआर।

संख्या के आकार पर कोई मार्गदर्शन नहीं देते हुए, मैंने 10 एक्स रेक्टो को चुना। हमें नहीं पता कि यह कैंडी बार या कार की कीमत है। मेरा मानना ​​है कि आप केवल "% .2f" भी कर सकते हैं ताकि कुल आकार निर्बाध हो सके।
dj_segfault 13

डीडी चाहता था कि दशमलव का हिस्सा छोड़ा जाए, अगर यह राशि मुद्रा इकाइयों का एक गोल नंबर है।
जर्बंजो

6

मैं इस एक का उपयोग कर रहा हूं (कॉमन्स-लैंग से स्ट्रिंगट्रिल्स का उपयोग करके):

Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");

आपको केवल लोकेल और संबंधित स्ट्रिंग को काटना चाहिए।


5

मुझे लगता है कि यह मुद्रा छापने के लिए सरल और स्पष्ट है:

DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$"
System.out.println(df.format(12345.678));

आउटपुट: $ 12,345.68

और प्रश्न के संभावित समाधानों में से एक:

public static void twoDecimalsOrOmit(double d) {
    System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d));
}

twoDecimalsOrOmit((double) 100);
twoDecimalsOrOmit(100.1);

आउटपुट:

100

100.10


आप पोस्ट के बिंदु से चूक गए हैं। यदि संख्या एक पूर्ण संख्या है, तो मैं किसी भी दशमलव को प्रदर्शित नहीं करना चाहता।
डीडी।

डीडी। मुझे क्षमा करें, और मैंने प्रश्न के अनुसार उत्तर को सही कर दिया।
एंड्रयू

5

हमें आम तौर पर उलटा करने की आवश्यकता होगी, यदि आपका जोंस मनी फील्ड फ्लोट है, तो यह 3.1, 3.15 या सिर्फ 3 के रूप में आ सकता है।

इस मामले में आपको उचित प्रदर्शन के लिए इसे गोल करने की आवश्यकता हो सकती है (और बाद में इनपुट क्षेत्र पर मास्क का उपयोग करने में सक्षम होने के लिए):

floatvalue = 200.0; // it may be 200, 200.3 or 200.37, BigDecimal will take care
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);

BigDecimal valueAsBD = BigDecimal.valueOf(value);
    valueAsBD.setScale(2, BigDecimal.ROUND_HALF_UP); // add digits to match .00 pattern

System.out.println(currencyFormatter.format(amount));

5

यह करने के लिए सबसे अच्छा तरीका है।

    public static String formatCurrency(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }

100 -> "100.00"
100.1 -> "100.10"


5
NumberFormat currency = NumberFormat.getCurrencyInstance();
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

उत्पादन:

$123.50

यदि आप मुद्रा बदलना चाहते हैं,

NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CHINA);
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

उत्पादन:

123.50

4

आपको कुछ इस तरह करना चाहिए:

public static void main(String[] args) {
    double d1 = 100d;
    double d2 = 100.1d;
    print(d1);
    print(d2);
}

private static void print(double d) {
    String s = null;
    if (Math.round(d) != d) {
        s = String.format("%.2f", d);
    } else {
        s = String.format("%.0f", d);
    }
    System.out.println(s);
}

जो प्रिंट करता है:

100

100,10


क्या Math.round (d)! = D काम करेगा? तैरने के साथ अक्सर! = अगर आपको लगता है कि यह भी है।
extraneon

1
दूसरे तरीके से, यदि d 100.000000000000001 होगा, तो यह अभी भी 100 के रूप में मुद्रित होगा
स्टीफन डी बोय

4

मुझे पता है कि यह एक पुराना सवाल है लेकिन ...

import java.text.*;

public class FormatCurrency
{
    public static void main(String[] args)
    {
        double price = 123.4567;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.print(df.format(price));
    }
}

3
यह काम नहीं करता है, यह उदाहरण के लिए 100.1 -> "100.1" करता है - देखें stackoverflow.com/questions/5033404/…
davnicwil

4

आप बस ऐसा कुछ कर सकते हैं और पूरी संख्या में और उसके बाद सेंट कर सकते हैं।

String.format("$%,d.%02d",wholeNum,change);

4

मैं @duffymo से सहमत हूं कि आपको java.text.NumberFormatइस तरह की चीजों के लिए तरीकों का उपयोग करने की आवश्यकता है । आप वास्तव में सभी स्वरूपण को मूल रूप से कर सकते हैं बिना किसी स्ट्रिंग के खुद की तुलना करते हुए:

private String formatPrice(final double priceAsDouble) 
{
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    if (Math.round(priceAsDouble * 100) % 100 == 0) {
        formatter.setMaximumFractionDigits(0);
    }
    return formatter.format(priceAsDouble);
}

युगल बिट इंगित करने के लिए:

  • पूरा Math.round(priceAsDouble * 100) % 100सिर्फ डबल्स / फ्लोट्स की अशुद्धि के आसपास काम कर रहा है। मूल रूप से सिर्फ अगर हम सैकड़ों जगह पर गोल करते हैं (शायद यह एक अमेरिकी पूर्वाग्रह है) तो शेष सेंट हैं।
  • दशमलव को हटाने की चाल setMaximumFractionDigits()विधि है

यह तय करने के लिए कि तर्क को कम करना चाहिए या नहीं, इसका उपयोग करने के लिए आपका तर्क चाहे जो हो setMaximumFractionDigits()


1
अपनी बात पुन बारे में *100और %100किया जा रहा अमेरिका पक्षपाती, आप इस्तेमाल कर सकते हैं Math.pow(10, formatter.getMaximumFractionDigits())एक हार्ड-कोडेड के बजाय 100स्थान के लिए सही संख्या का उपयोग करने के ...
daiscog

3

यदि आप मुद्राओं पर काम करना चाहते हैं, तो आपको बिगडेसिमल क्लास का उपयोग करना होगा। समस्या यह है कि, मेमोरी में कुछ फ्लोट नंबरों को स्टोर करने का कोई तरीका नहीं है (जैसे। आप 5.3456, लेकिन 5.3455 स्टोर नहीं कर सकते हैं), जो खराब गणना में प्रभाव डाल सकते हैं।

BigDecimal और मुद्राओं के साथ सहयोग करने का एक अच्छा लेख है:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html


2
यह मेरे द्वारा पूछे गए सवाल से पूरी तरह अप्रासंगिक है।
डीडी।

3

प्रारूप 1000000.2 से 1 000 000,20 तक

private static final DecimalFormat DF = new DecimalFormat();

public static String toCurrency(Double d) {
    if (d == null || "".equals(d) || "NaN".equals(d)) {
        return " - ";
    }
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols();
    symbols.setGroupingSeparator(' ');
    String ret = DF.format(bd) + "";
    if (ret.indexOf(",") == -1) {
        ret += ",00";
    }
    if (ret.split(",")[1].length() != 2) {
        ret += "0";
    }
    return ret;
}

2

इस पोस्ट ने मुझे वास्तव में मदद की जो मुझे चाहिए। इसलिए मैं सिर्फ दूसरों की मदद करने के लिए यहां अपना कोड योगदान देना चाहता था। यहाँ कुछ स्पष्टीकरण के साथ मेरा कोड है।

निम्नलिखित कोड:

double moneyWithDecimals = 5.50;
double moneyNoDecimals = 5.00;
System.out.println(jeroensFormat(moneyWithDecimals));
System.out.println(jeroensFormat(moneyNoDecimals));

वापस होगा:

5,-
€ 5,50

वास्तविक जेरोन्सफॉर्म () विधि:

public String jeroensFormat(double money)//Wants to receive value of type double
{
        NumberFormat dutchFormat = NumberFormat.getCurrencyInstance();
        money = money;
        String twoDecimals = dutchFormat.format(money); //Format to string
        if(tweeDecimalen.matches(".*[.]...[,]00$")){
            String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3);
                return zeroDecimals;
        }
        if(twoDecimals.endsWith(",00")){
            String zeroDecimals = String.format("€ %.0f,-", money);
            return zeroDecimals; //Return with ,00 replaced to ,-
        }
        else{ //If endsWith != ,00 the actual twoDecimals string can be returned
            return twoDecimals;
        }
}

विधि प्रदर्शित करता हैजेरोसेफ़ॉर्मैट जो विधि को जेरोन्सफार्मेट कहता है ()

    public void displayJeroensFormat()//@parameter double:
    {
        System.out.println(jeroensFormat(10.5)); //Example for two decimals
        System.out.println(jeroensFormat(10.95)); //Example for two decimals
        System.out.println(jeroensFormat(10.00)); //Example for zero decimals
        System.out.println(jeroensFormat(100.000)); //Example for zero decimals
    }

निम्नलिखित उत्पादन होगा:

10,5010,9510,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)

यह कोड आपकी वर्तमान मुद्रा का उपयोग करता है। मेरे मामले में वह हॉलैंड है, इसलिए मेरे लिए स्वरूपित स्ट्रिंग अमेरिका में किसी के लिए अलग होगी।

  • हॉलैंड: 999.999,99
  • यूएस: 999,999.99

बस उन संख्याओं के अंतिम 3 वर्ण देखें। मेरे कोड में यह जांचने के लिए कि क्या अंतिम 3 वर्ण ", 00" के बराबर हैं, कथन है। अमेरिका में इसका उपयोग करने के लिए आपको इसे ".00" में बदलना पड़ सकता है यदि यह पहले से ही काम नहीं करता है।


2

मैं अपने फंक्शन को लिखने के लिए काफी पागल था:

यह पूर्णांक को मुद्रा प्रारूप में बदल देगा (दशमलव के रूप में अच्छी तरह से संशोधित किया जा सकता है):

 String getCurrencyFormat(int v){
        String toReturn = "";
        String s =  String.valueOf(v);
        int length = s.length();
        for(int i = length; i >0 ; --i){
            toReturn += s.charAt(i - 1);
            if((i - length - 1) % 3 == 0 && i != 1) toReturn += ',';
        }
        return "$" + new StringBuilder(toReturn).reverse().toString();
    }

2
  public static String formatPrice(double value) {
        DecimalFormat formatter;
        if (value<=99999)
          formatter = new DecimalFormat("###,###,##0.00");
        else
            formatter = new DecimalFormat("#,##,##,###.00");

        return formatter.format(value);
    }

1

इसके बजाय मैंने सेंट के रूप में राशि का प्रतिनिधित्व करने के लिए एक पूर्णांक का उपयोग करते हुए यह किया है:

public static String format(int moneyInCents) {
    String format;
    Number value;
    if (moneyInCents % 100 == 0) {
        format = "%d";
        value = moneyInCents / 100;
    } else {
        format = "%.2f";
        value = moneyInCents / 100.0;
    }
    return String.format(Locale.US, format, value);
}

इसके साथ समस्या NumberFormat.getCurrencyInstance()यह है कि कभी-कभी आप वास्तव में $ 20 को $ 20 चाहते हैं, यह सिर्फ $ 20.00 से बेहतर दिखता है।

अगर किसी को भी ऐसा करने का एक बेहतर तरीका मिल जाता है, नंबरफार्मेट का उपयोग करके, मैं सभी कान हूं।


1

उन लोगों के लिए जो मुद्रा को प्रारूपित करना चाहते हैं, लेकिन यह नहीं चाहते कि यह स्थानीय पर आधारित हो, हम यह कर सकते हैं:

val numberFormat = NumberFormat.getCurrencyInstance() // Default local currency
val currency = Currency.getInstance("USD")            // This make the format not locale specific 
numberFormat.setCurrency(currency)

...use the formator as you want...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.