জাভা কারেন্সি নম্বর ফর্ম্যাট


91

দশমিকের ফর্ম্যাট করার উপায় আছে কি?

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
গৌণ নিটপিক: বিট প্যাটার্ন 0x42c80000 সহ একটি ফ্লোট ঠিক 100 হতে পারে।
করোল এস

4
হ্যাঁ, কারোল এস বলেছিলেন, অনেক সংখ্যা ভাসমানের সাথে ঠিক মিলে যেতে পারে। শুধু সমস্ত নম্বর নয়। 100 হ'ল এমন একটি সংখ্যা যা প্রতিনিধিত্ব করতে পারে, আপনার কেবল এমন সংখ্যার জন্য অ্যাকাউন্ট করা উচিত যা তা হতে পারে না।
csga5000

160

আমি 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);
    }
}

17
মুদ্রা উপস্থাপনের জন্য আপনার কখনও দ্বিগুণ ব্যবহার করা উচিত নয়। হয় লম্বায় রূপান্তর করুন এবং দশমিক পয়েন্টটি নিজে পরিচালনা করুন বা BigDecimalএকটি ফর্ম্যাটর ব্যবহার করুন । joda-money.sourceforge.net একবার হয়ে গেলে এটি ব্যবহার করার জন্য একটি দুর্দান্ত লাইব্রেরি হওয়া উচিত।
জিপামপাড়া

4
আমি রাজি: দ্বিগুন!
ডাফাইমো

4
মুদ্রাগুলি কীভাবে কাজ করে আপনি কী বোঝাতে চান? আমি কিছু বলতে পারি $ 1 ডলার নয় $ 1.00 .... মুদ্রাগুলি প্রদর্শনের বিভিন্ন উপায় রয়েছে (ডিফল্ট ব্যতীত) এবং এই প্রশ্নগুলির দশমিক অংশটি যদি সম্পূর্ণ সংখ্যা হয় তবে কীভাবে বাদ দিতে পারে তা জিজ্ঞাসা করে।
ডিডি।

4
এটি একটি রেন্ডারিং ইস্যু। স্ট্রিং হিসাবে মুদ্রা গ্রহণ করার জন্য আপনার ইউআইতে যুক্তি রাখুন এবং যদি এটি কোনও ডলার হয় তবে দশমিক এবং সেন্ট কেটে নিন।
duffymo

4
সম্মত - এই কারণেই আমি 5.5 বছর আগে যখন এটি লিখেছিলাম তখন আমি লোকাল ব্যবহার করার পরামর্শ দিয়েছি। "তবে, যদি আপনার অবশ্যই করা উচিত ...." মূল বাক্যাংশ।
duffymo

126
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


দেখে মনে হচ্ছে না যে "মুদ্রা" রেফারেন্সযুক্ত বা এটি ঘোষণার পরে ব্যবহৃত হয়েছে ... লাইন 3 এর কোনও পার্শ্ব প্রতিক্রিয়া আছে? বা কোনও কারণে আপনি এটি অন্তর্ভুক্ত করেছেন?
দামিয়ান

[শ্রেণি লোকাল
থিলিনা

18

গুগল অনুসন্ধানের পরে আমি কোনও ভাল সমাধান পাইনি, কেবল রেফারেন্সের জন্য আমার সমাধান পোস্ট করুন। অর্থ ফর্ম্যাট করতে প্রাইসটোস্ট্রিং ব্যবহার করুন ।

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);
    }
}

তিনি এর চেয়ে ভাল আর কখনও বলেননি। তিনি কেবল তার সমাধান পোস্ট করেছেন যাতে অন্যরা এটি থেকে উল্লেখ করতে পারে। অন্তত আপনি বলতে পারেন একটি ধন্যবাদ।
উমং দেশাই

4
আমি যদি ভারতীয় ফর্ম্যাটে দামটি প্রদর্শন করতে চাই তবে কী হবে। দশমিক ছাড়াই। ফর্ম্যাট -> ##, ##, ###
ভুবন

দাম অনুসারে ডেসিমাল (ডাবল) পদ্ধতিতে মান "0" হলে "0,00" দেখানোর জন্য মাস্ক পরিবর্তন "###,###,###.00"করার চেষ্টা করুন"###,###,##0.00"
ডেলাসাভিয়া

4
ফর্ম্যাট মুদ্রাকে আবার
ডাবলে

6

হ্যাঁ. আপনি java.util.formatter ব্যবহার করতে পারেন । আপনি "% 10.2f" এর মতো বিন্যাসের স্ট্রিং ব্যবহার করতে পারেন


String.format()এটির জন্য একটি দুর্দান্ত স্ট্যাটিক মোড়ক। যদিও আপনি '10' ব্যবহার করেন তা নিশ্চিত নয়।
এক্সআর

সংখ্যার আকার সম্পর্কে কোনও দিকনির্দেশনা না দিয়ে আমি 10 প্রাক্তন রেক্টো বেছে নিয়েছি। আমরা জানি না এটি কোনও ক্যান্ডি বার বা গাড়ির দাম কিনা। আমি বিশ্বাস করি আপনি মোট আকারটি সীমাহীন রাখতে কেবল "% .2f "ও করতে পারেন।
dj_segfault

ডিডি দশমিক অংশ বাদ দিতে চেয়েছিল, যদি পরিমাণটি মুদ্রা ইউনিটের একটি গোল সংখ্যা হয়।
জার্নবজো

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


ম্যাথ.উন্ড (ডি)! = ডি কাজ করবে? এটি প্রায়শই ভাসে! = এমনকি যদি আপনি এটি ভাবেন।
এক্সারেনন

4
অন্য উপায়ে, ডি যদি 100.00000000000000001 হয় তবে এটি এখনও 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));
    }
}

4
এই না কাজ করে, এটা 100,1 করে -> "100,1" উদাহরণস্বরূপ - দেখুন stackoverflow.com/questions/5033404/...
davnicwil

4

আপনি ঠিক এটির মতো কিছু করতে পারেন এবং পুরো সংখ্যায় এবং পরে সেন্টগুলি পরে পাস করতে পারেন।

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

4

আমি @ ডুফাইমোর সাথে একমত যে আপনাকে 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()ব্যবহার করা উচিত।


4
আপনার পয়েন্ট পুনরায় সম্পর্কে *100এবং %100হচ্ছে ইউএস-পক্ষপাতমূলক, আপনি ব্যবহার করতে পারে Math.pow(10, formatter.getMaximumFractionDigits())একটি হার্ড কোড পরিবর্তে 100লোকেল জন্য সঠিক সংখ্যা ব্যবহার করতে ...
daiscog

3

আপনি যদি মুদ্রায় কাজ করতে চান তবে আপনাকে বিগডিসিমাল ক্লাস ব্যবহার করতে হবে। সমস্যাটি হ'ল মেমরিতে কিছু ভাসমান সংখ্যা সংরক্ষণ করার উপায় নেই (যেমন আপনি 5.3456 সঞ্চয় করতে পারেন তবে 5.3455 নয়), যা খারাপ গণনায় প্রভাব ফেলতে পারে।

বিগডিসিমাল এবং মুদ্রাগুলিতে কীভাবে সহযোগিতা করবেন তার একটি সুন্দর নিবন্ধ রয়েছে:

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


4
আমি যে প্রশ্নটি চেয়েছি তা এটি সম্পূর্ণ অপ্রাসঙ্গিক।
ডিডি।

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();
    }


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, এটি কেবল .00 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...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.