2016-03-22 18 views
11

Neden java.text.DecimalFormat aşağıdaki sonuçları değerlendiriyor:DecimalFormat ". #" Ve "0. #" neden 23.0'da farklı sonuçlar veriyor?

new DecimalFormat("0.#").format(23.0)  // result: "23" 

new DecimalFormat(".#").format(23.0)   // result: "23.0" 

Ben sonuç her iki durumda da 23 olması bekleniyor olurdu, özel karakter # sıfır yoksaydığından. Önde gelen özel karakter 0, kesir kısmını nasıl etkiler? (Javadoc'ta verilen BNF ile eşleşmeye/anlamaya çalıştı ancak bunu gerçekleştiremedi.)

+0

"#. #", Geçerli bir biçim olup olmadığını ve "23" ile sonuçlanan "#. #" Olmaması gerekiyor. – Tom

+0

@ Tom: DecimalFormat (". 0") da çalışıyor. ". #" Gibi şeyler yasaklayan javadoc'ta hiçbir şey görmedim. – MGn

+0

* "Javadoc'ta hiçbir şeyi yasaklayan hiçbir şey görmedim" #: # * Ben de değil, ama bu kodun doğru şekilde işleyebileceği anlamına gelmiyor. Aynı zamanda, "# # #" veya ".0" geçersiz olduğunda ve "geri dönüş", aynı dize ile sonuçlanacağından ("23.0") sonuçlanacağından, "DecimalFormat (". 0 ") işlevlerinin tesadüfi olabileceğini '). Ama yine, bu sadece bir tahmin. – Tom

cevap

7

İkinci biçim, JavaDoc'a göre geçersiz görünüyor, ancak bir şekilde hata olmadan ayrılıyor. Ben biçimlendiricisine davranışını beklediğiniz Bu durumda

Pattern: 
     PositivePattern 
     PositivePattern ; NegativePattern 
PositivePattern: 
     Prefixopt Number Suffixopt 
NegativePattern: 
     Prefixopt Number Suffixopt 
Prefix: 
     any Unicode characters except \uFFFE, \uFFFF, and special characters 
Suffix: 
     any Unicode characters except \uFFFE, \uFFFF, and special characters 
Number: 
     Integer Exponentopt 
     Integer . Fraction Exponentopt 
Integer: 
     MinimumInteger 
     # 
     # Integer 
     # , Integer 
MinimumInteger: 
     0 
     0 MinimumInteger 
     0 , MinimumInteger 
Fraction: 
     MinimumFractionopt OptionalFractionopt 
MinimumFraction: 
     0 MinimumFractionopt 
OptionalFraction: 
     # OptionalFractionopt 
Exponent: 
     E MinimumExponent 
MinimumExponent: 
     0 MinimumExponentopt 

tanımsız edilecek. Yani, herhangi bir eski şey üretebilir ve bunun herhangi bir şekilde tutarlı veya anlamlı olduğuna güvenemeyiz. Yani, neden 23.0'ı aldığınızı bilmiyorum, ancak kodunuzda kaçınmanızın saçmalık olduğunu varsayabilirsiniz.

Güncelleştirme: Java 7'nin DecimalFormat kitaplığı aracılığıyla bir hata ayıklayıcısını çalıştırıyorum. Kod sadece açıkça belirtmekle kalmıyor, '. #' Buna izin verildiğini gösteren bir yorum var (java.text.DecimalFormat: 2582-2593) ve buna izin veren bir uygulama (satır 2597). Bu, kalıp için belgelendirilmiş BNF'yi ihlal ediyor gibi görünüyor. Bu, belgelenmiş bir davranış olmadığı göz önüne alındığında, Java sürümleri ve hatta kitaplık uygulamaları arasında değişiklik yapmakla yükümlü olduğu için ona güvenmemeniz gerekir.

3

Aşağıdaki kaynak yorumu, ".#"'un oldukça belirsiz şekilde ele alınmasını açıklamaktadır. geliştiriciler ".0##" olarak ".#" yorumlamak seçmiş gibi

// Handle patterns with no '0' pattern character. These patterns 
// are legal, but must be interpreted. "##.###" -> "#0.###". 
// ".###" -> ".0##". 

görünüyor, bunun yerine ( "0.#") beklentinizin ne: my DecimalFormat.java dosyası (JDK 8) 'de Hatları 3383-3385 ​​şu yorumu var.

+0

Sadece DecimalFormat'ın kaynak koduna bakıyordum ve bunu gördüm. – callyalater

+0

Zaten bu cevabımda bunu yanıtladım, ama size farklı hat numaralarım var. Bu tutarsızlığa neyin sebep olduğunu merak ediyorum? Burada referans olarak kullandığınız java versiyonundan bahsetmediniz. Sorumlu olabileceği için bunu açıklık için ekleyebilir misiniz? –

+0

JDK 8 kullanıyorum, fark bu. – MicSim

İlgili konular