次のように小数をフォーマットする方法はありますか?
100 -> "100"
100.1 -> "100.10"
四捨五入の場合は小数部を省略してください。それ以外の場合は、小数点以下2桁でフォーマットします。
回答:
疑わしい。問題は、フロートの場合、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);
これには、ロケール固有であるという追加の利点があります。
ただし、必要に応じて、1ドルの場合は、返される文字列を切り捨てます。
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
グーグル検索の後で良い解決策が見つかりませんでした。他の人が参照できるように解決策を投稿してください。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"
はい。java.util.formatterを使用できます。「%10.2f」のようなフォーマット文字列を使用できます
String.format()
そのための優れた静的ラッパーです。ただし、なぜ「10」を使用するのかわかりません。
私はこれを使用しています(commons-langのStringUtilsを使用):
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
そして、質問に対する可能な解決策の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
通常、逆を行う必要があります。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));
それを行うためのこの最良の方法。
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
この種の方法を使用する必要があるという@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()
使用する必要があります。
*100
と%100
米国に偏っていることについてのあなたのポイントを再確認してください、あなたはロケールのために正しい番号を使用するためにMath.pow(10, formatter.getMaximumFractionDigits())
ハードコードさ100
れた代わりに使うことができます...
通貨で作業したい場合は、BigDecimalクラスを使用する必要があります。問題は、一部の浮動小数点数をメモリに格納する方法がないことです(たとえば、5.3456は格納できますが、5.3455は格納できません)。これは、悪い計算に影響を与える可能性があります。
BigDecimalと通貨と協力する方法についての素晴らしい記事があります:
http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html
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;
}
この投稿は、私が最終的に欲しいものを手に入れるのに本当に役立ちました。だから私は他の人を助けるためにここに自分のコードを提供したかっただけです。これが私のコードと説明です。
次のコード:
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,50
€ 10,95
€ 10,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)
このコードは現在の通貨を使用します。私の場合はオランダなので、フォーマットされた文字列は米国の誰かとは異なります。
それらの数字の最後の3文字を見てください。私のコードには、最後の3文字が "、00"に等しいかどうかを確認するifステートメントがあります。米国でこれを使用するには、まだ機能していない場合は「.00」に変更する必要がある場合があります。
私は自分の関数を書くのに夢中でした:
これにより、整数が通貨形式に変換されます(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();
}
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よりも見栄えがよいことです。
NumberFormatを使用してこれを行うためのより良い方法を誰かが見つけた場合、私はすべての耳です。