Java'da ondalık ayırıcı olarak kuvvet noktası (".")


105

Şu anda bir çift yazdırmak için aşağıdaki kodu kullanıyorum:

return String.format("%.2f", someDouble);

Bu, Java'nın bir nokta kullanmak istediğim halde Yerel Ayarımın ondalık ayırıcısını (virgül) kullanması dışında iyi çalışıyor. Bunu yapmanın kolay bir yolu var mı?


Çift değeri kesin ondalık sayılarla kullanmanız gerekiyorsa, belki double / Double yerine BigDecimal kullanmalısınız. Çift değişken kullanırken karşılaşabileceğiniz sorunlar için bu bağlantıya bakın . Bunu da deneyebilirsiniz: System.out.println (5.1d + 1.1d); - sonuç 6.2 yerine 6.199999999999999 olacaktır. Dize olarak ondalık sayılarla sayıların nasıl biçimlendirileceğini arayan birinin çift değişkenleri atlaması gerektiğini düşünüyorum.
razvanone

Yanıtlar:


174

String.formatYerel ayarı belirlemenize izin veren aşırı yüklemeyi kullanın :

return String.format(Locale.ROOT, "%.2f", someDouble);

Eğer ediyorsanız sadece bir numara biçimlendirme - Burada olduğu gibi - o zaman kullanarak NumberFormatmuhtemelen daha uygun olacaktır. Ancak, biçimlendirme yeteneklerinin geri kalanına ihtiyacınız varsa String.format, bu iyi çalışmalıdır.


6
Locale.ROOT daha tarafsızdır.
speedogoo

@speedogoo: Düzenlendi, ancak sayı biçimlendirmesinden şüphelenmeme rağmen herhangi bir fark yaratmıyor.
Jon Skeet

1
Evet, ama ABD ve İngiltere arasında seçim yapmanıza gerek yok. 😜
speedogoo

2
Locale.ROOT, bir ülkenin ondalık ayırıcı seçiminde gelecekteki olası değişikliklere karşı da güvenlidir.
Attila TANYI

IMO bu soruyu yanıtlamaz, bunun yerine Locale.setDefault (yeni Yerel Ayar ("en", "US")); başka bir cevapta belirtildiği gibi yapar. Doğru, küresel olduğu için istenmeyen yan etkilere sahip olabilir, programcı olarak OTH gerçekten istediğim şey küresel varsayılanın ABD olmasıdır, çünkü kodumda yerel ayarı önemsediğim her yerde bunu açıkça yapıyorum.
nyholku

21

Daha sert bir çözüm, Yerel Ayarınızı main () 'e erken ayarlamaktır.

Sevmek:

Locale.setDefault(new Locale("en", "US"));

11
Bu çok sorunlu bir cevaptır, çünkü küresel bir etkiye sahiptir ve bu nedenle birçok başka (muhtemelen istenmeyen) değişikliğe neden olabilir.
sleske

2
IMO bu sorunun doğru cevabı ve programcı olarak benim de istediğim bu. Java'nın kodumun aslında yerelleştirmeye ihtiyaç duyduğum her yerde olduğu gibi varsayılan olarak ABD yerel ayarını kullanmasını istiyorum, bunu kodumda açıkça belirteceğim. Belki alışkanlıklarım olabilir ama printf / format yerel yerel ayarımı kullandığında çok can sıkıcı oluyor çünkü ondalık 'virgül' kullandığım diğer yazılımlarla (Matlab herkes) tamamen uyumsuz oluyor.
nyholku

10

Java.lang.String.format'a ve ayrıca java.io.PrintStream.printf'e (örneğin System.out.printf ()) ek bir Yerel Ayar iletebilirsiniz:

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Bu, aşağıdakilerle sonuçlanır (bilgisayarımda):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Java API'de String.format konusuna bakın .


4
Yerel ayardan bağımsız bir temsil elde etmek için out.printf((Locale)null, ...)veya öğesini de kullanabilirsiniz out.format((Locale)null, ...). (ve ayrıca var Locale.ROOT)
eckes

10

Çok geç, ancak burada belirtildiği gibi, NumberFormat(ve alt sınıfının DecimalFormat) örnek kullanımı

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

DecimalFormatSymbolsAyırıcı oluşturmanın ve ayarlamanın bu yöntemden önce bir kez yapılması gerektiğini hissediyorum .
Satır

0

NumberFormat ve DecimalFormat'ı kullanabilirsiniz.

Java Tutorials LocaleSpecific Formatting'den bu bağlantıya bir göz atın

Yerel Ayara Duyarlı Biçimlendirme başlıklı bölüm ihtiyacınız olan şeydir.


-3

Ben de aynı sorunu yaşadım .. 55.1dönüştü 55,10. Hızlı (kirli mi?) Düzeltmem:

String.format("%.2f", value).replaceAll(",",".");


1
Bu, yalnızca biri kodunuzu farklı bir yerel ayarda çalıştırmayı deneyene kadar çalışır. Gerçek bir çözüm değil. -1
Marco Freudenberger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.