দশমিকের ফর্ম্যাট করার উপায় আছে কি?
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);
এটি স্থানীয় নির্দিষ্ট হওয়ার অতিরিক্ত সুবিধা রয়েছে the
তবে, যদি আপনাকে অবশ্যই স্ট্রিংটি কেটে ফেলুন তবে এটি পুরো ডলার হলেই ফিরে পাবেন:
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));
মুদ্রা প্রদর্শনের সেরা উপায়
আউটপুট
.00 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
গুগল অনুসন্ধানের পরে আমি কোনও ভাল সমাধান পাইনি, কেবল রেফারেন্সের জন্য আমার সমাধান পোস্ট করুন। অর্থ ফর্ম্যাট করতে প্রাইসটোস্ট্রিং ব্যবহার করুন ।
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"
হ্যাঁ. আপনি 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);
আমি @ ডুফাইমোর সাথে একমত যে আপনাকে 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 নয়), যা খারাপ গণনায় প্রভাব ফেলতে পারে।
বিগডিসিমাল এবং মুদ্রাগুলিতে কীভাবে সহযোগিতা করবেন তার একটি সুন্দর নিবন্ধ রয়েছে:
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, এটি কেবল .00 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...