2016-11-11 9 views
1

これはSwift 3、Xcode 8.1
私はnanを期待していました。NSDecimalNumber(文字列: "。")は0(ゼロ)を返します。どうして?

これはバグですか?

説明するために:

Playground

を処理する方法上の任意のアイデア ""?私はのようなものを避けるしたいと思い

if string == "." { ... } 

guard string =! "." { ... } 
+4

これはバグよりも多くの機能です。 (なぜ)明示的に除外したいのですか?有効な入力として? – luk2302

+1

好奇心 - デバイスのロケールがカンマを小数点として使用するロケールに設定されている場合、 'NSDecimalNumber(string:"、 ")'(コンマを使用)で何が起こるか。 – rmaddy

+0

@rmaddyその文字は、ロケールの小数点の区切り文字 'Decimal(文字列:"。 "、ロケール:ロケール(識別子:" de "))' NaNを返します。 – Sulthan

答えて

2

0は有効な入力です。

0.は有効な入力です。

.0は有効な入力です。

.も有効な入力であることは驚きではありません。奇妙ではありますが、驚くべきことではありません。

これは、文字が現在のロケールと一致する場合にのみ有効です。 .は英語ロケールで動作しますが、ドイツ語のロケールおよびその逆ではない。要するに

Decimal(string: ".", locale: Locale(identifier: "de")) // NaN 
Decimal(string: ",", locale: Locale(identifier: "de")) // Optional(0) 

、両方の先頭と末尾のゼロを省略することができます。

この値を処理したい場合は、正規表現を使用することをおすすめします。どのフォーマットが有効であるかを決め、そのフォーマットの正規表現を書いて、その正規表現で文字列をチェックします。

+1

私は同意しません。答えは「5」と書かれているはずです。 '5.'が有効です。 '.5'が有効です。これは '.'を有効にするものではなく、' 0'にしません。 – rmaddy

+0

@rmaddy私の推論では、先頭または末尾のゼロを省略することができます。奇妙ですが、私はそれをバグとはみなしません。 – Sulthan

+0

私には奇妙に見える別のもの: 'nan'も'、 '(期待)のために返されます(ちょうどPlaygroundの例を更新しました)。あなたが説明したことに続き、 '0'も返すべきでしょうか? –

関連する問題