Java通貨番号形式


89

次のように小数をフォーマットする方法はありますか?

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

四捨五入の場合は小数部を省略してください。それ以外の場合は、小数点以下2桁でフォーマットします。

回答:


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です。
Karol S

2
はい、Karol Sが述べたように、多くの数値はフロートと正確に一致させることができます。すべての数字ではありません。100は表現できる数字の1つであり、表現できない数字を考慮する必要があります。
csga5000 2015

160

java.textパッケージの使用をお勧めします。

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

これには、ロケール固有であるという追加の利点があります。

ただし、必要に応じて、1ドルの場合は、返される文字列を切り捨てます。

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

17
通貨を表すためにdoubleを使用しないでください。longに変換して小数点を自分で管理するかBigDecimal、フォーマッタで使用します。 joda-money.sourceforge.netは、完了したら使用するのに適したライブラリになるはずです。
gpampara 2010年

5
私はre:double!= moneyに同意しますが、それは質問が提起された方法ではありません。
duffymo 2010年

3
それが通貨のしくみとはどういう意味ですか?私は何かが$ 1.00ではなく$ 1の費用がかかると言うことができます....通貨を表示するさまざまな方法があります(デフォルト以外)。この質問では、整数の場合は小数部分を省略する方法を尋ねます。
DD。

1
これはレンダリングの問題です。通貨を文字列として受け入れるようにUIにロジックを配置し、正確なドルの場合は小数とセントを切り捨てます。
duffymo 2012

2
同意しました-そのため、5。5年前にこれを書いたときにロケールの使用をお勧めしました。「でも、やらなきゃいけないのなら……」がキーワードです。
duffymo 2015

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

グーグル検索の後で良い解決策が見つかりませんでした。他の人が参照できるように解決策を投稿してください。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);
    }
}

彼はそれがより良いものだとは決して言いませんでした。彼は自分のソリューションを投稿したので、他の人がそれから参照できます。少なくともあなたが言うことができるのは感謝です。
Umang Desai 2013年

価格をインド形式で表示したい場合はどうすればよいですか。小数なし。フォーマット-> ##、##、###
ブーバン2013

priceWithDecimal(Double)メソッドで、値が「0」のときに「"###,###,###.00""###,###,##0.00"
0,00

1
逆にフォーマットされた通貨を再びダブルに変換するにはどうしますか
Vivek Shankar 2015

6

はい。java.util.formatterを使用できます。「%10.2f」のようなフォーマット文字列を使用できます


String.format()そのための優れた静的ラッパーです。ただし、なぜ「10」を使用するのかわかりません。
Xrを。

数の大きさについてのガイダンスがないので、私は10 ExRectoを選びました。これがキャンディーバーの価格なのか車の価格なのかはわかりません。「%.2f」を実行するだけで、合計サイズを無制限にすることもできると思います。
dj_segfault 2010年

金額が通貨単位の丸め数である場合、DDは小数部分を省略したいと考えていました。
jarnbjo 2010年

6

私はこれを使用しています(commons-langのStringUtilsを使用):

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

そして、質問に対する可能な解決策の1つ:

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


あなたは投稿の要点を見逃しました。数値が整数の場合、小数は表示しません。
DD。

DD。申し訳ありませんが、質問に応じて回答を修正しました。
アンドリュー

5

通常、逆を行う必要があります。jsonマネーフィールドがフロートの場合、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として出力されます
Stefan De Boey 2010年

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

java.text.NumberFormatこの種の方法を使用する必要があるという@duffymoに同意します。文字列を比較せずに、実際にすべてのフォーマットをネイティブに実行できます。

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 2015

3

通貨で作業したい場合は、BigDecimalクラスを使用する必要があります。問題は、一部の浮動小数点数をメモリに格納する方法がないことです(たとえば、5.3456は格納できますが、5.3455は格納できません)。これは、悪い計算に影響を与える可能性があります。

BigDecimalと通貨と協力する方法についての素晴らしい記事があります:

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


2
これは私が尋ねた質問とはまったく無関係です。
DD。

3

1000000.2から1000 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

実際のjeroensFormat()メソッド:

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

メソッドjeroensFormat()を呼び出すメソッドdisplayJeroensFormat

    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"に等しいかどうかを確認するifステートメントがあります。米国でこれを使用するには、まだ機能していない場合は「.00」に変更する必要がある場合があります。


2

私は自分の関数を書くのに夢中でした:

これにより、整数が通貨形式に変換されます(10進数でも変更できます)。

 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よりも見栄えがよいことです。

NumberFormatを使用してこれを行うためのより良い方法を誰かが見つけた場合、私はすべての耳です。


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.