क्या दशमलव को प्रारूपित करने का एक तरीका निम्नलिखित है:
100 -> "100"
100.1 -> "100.10"
यदि यह एक गोल संख्या है, तो दशमलव भाग को छोड़ दें। अन्यथा दो दशमलव स्थानों के साथ प्रारूपित करें।
जवाबों:
मुझे शक है। समस्या यह है कि 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
}
}
मैं 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);
}
}
BigDecimal
फ़ॉर्मेटर के साथ उपयोग करें । joda-money.sourceforge.net एक बार काम पूरा करने के लिए एक अच्छी लाइब्रेरी होनी चाहिए।
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
मुझे 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);
}
}
"###,###,###.00"
लिए मास्क बदलने की कोशिश करें "###,###,##0.00"
जब मान "0" हो
हाँ। आप java.util.formatter का उपयोग कर सकते हैं । आप "% 10.2f" जैसे एक स्वरूपण स्ट्रिंग का उपयोग कर सकते हैं
String.format()
उसके लिए एक अच्छा स्थिर आवरण है। यकीन नहीं है कि आप '10' का उपयोग क्यों करते हैं, हालांकि।
मैं इस एक का उपयोग कर रहा हूं (कॉमन्स-लैंग से स्ट्रिंगट्रिल्स का उपयोग करके):
Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");
आपको केवल लोकेल और संबंधित स्ट्रिंग को काटना चाहिए।
मुझे लगता है कि यह मुद्रा छापने के लिए सरल और स्पष्ट है:
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
हमें आम तौर पर उलटा करने की आवश्यकता होगी, यदि आपका जोंस मनी फील्ड फ्लोट है, तो यह 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));
यह करने के लिए सबसे अच्छा तरीका है।
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"
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
आपको कुछ इस तरह करना चाहिए:
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
मुझे पता है कि यह एक पुराना सवाल है लेकिन ...
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));
}
}
आप बस ऐसा कुछ कर सकते हैं और पूरी संख्या में और उसके बाद सेंट कर सकते हैं।
String.format("$%,d.%02d",wholeNum,change);
मैं @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()
।
*100
और %100
किया जा रहा अमेरिका पक्षपाती, आप इस्तेमाल कर सकते हैं Math.pow(10, formatter.getMaximumFractionDigits())
एक हार्ड-कोडेड के बजाय 100
स्थान के लिए सही संख्या का उपयोग करने के ...
यदि आप मुद्राओं पर काम करना चाहते हैं, तो आपको बिगडेसिमल क्लास का उपयोग करना होगा। समस्या यह है कि, मेमोरी में कुछ फ्लोट नंबरों को स्टोर करने का कोई तरीका नहीं है (जैसे। आप 5.3456, लेकिन 5.3455 स्टोर नहीं कर सकते हैं), जो खराब गणना में प्रभाव डाल सकते हैं।
BigDecimal और मुद्राओं के साथ सहयोग करने का एक अच्छा लेख है:
http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html
प्रारूप 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;
}
इस पोस्ट ने मुझे वास्तव में मदद की जो मुझे चाहिए। इसलिए मैं सिर्फ दूसरों की मदद करने के लिए यहां अपना कोड योगदान देना चाहता था। यहाँ कुछ स्पष्टीकरण के साथ मेरा कोड है।
निम्नलिखित कोड:
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,50
€ 10,95
€ 10,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)
यह कोड आपकी वर्तमान मुद्रा का उपयोग करता है। मेरे मामले में वह हॉलैंड है, इसलिए मेरे लिए स्वरूपित स्ट्रिंग अमेरिका में किसी के लिए अलग होगी।
बस उन संख्याओं के अंतिम 3 वर्ण देखें। मेरे कोड में यह जांचने के लिए कि क्या अंतिम 3 वर्ण ", 00" के बराबर हैं, कथन है। अमेरिका में इसका उपयोग करने के लिए आपको इसे ".00" में बदलना पड़ सकता है यदि यह पहले से ही काम नहीं करता है।
मैं अपने फंक्शन को लिखने के लिए काफी पागल था:
यह पूर्णांक को मुद्रा प्रारूप में बदल देगा (दशमलव के रूप में अच्छी तरह से संशोधित किया जा सकता है):
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();
}
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);
}
इसके बजाय मैंने सेंट के रूप में राशि का प्रतिनिधित्व करने के लिए एक पूर्णांक का उपयोग करते हुए यह किया है:
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 से बेहतर दिखता है।
अगर किसी को भी ऐसा करने का एक बेहतर तरीका मिल जाता है, नंबरफार्मेट का उपयोग करके, मैं सभी कान हूं।
उन लोगों के लिए जो मुद्रा को प्रारूपित करना चाहते हैं, लेकिन यह नहीं चाहते कि यह स्थानीय पर आधारित हो, हम यह कर सकते हैं:
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...