NSDecimalNumber to po prostu klasa pamięci dla danych liczbowych. Uruchamia on analizator składni (NSNumberFormatter) w ciągu, który przekazujesz, aby utworzyć jego numer. Powód, dla którego twoja druga loga działa "lepiej", polega na tym, że pierwsza używa domyślnego ustawienia narodowego (to wygląda jak to en_US, ale nie mogę tego zweryfikować, zobacz edycję cios, aby uzyskać więcej informacji.) do parsowania, a "100,1" nie jest prawidłową liczbą, więc część "nieliczbowa" zostaje usunięta. Określając ustawienia regionalne, które używają separatorów dziesiętnych ",", przechwytuje on pełną liczbę.
Kiedy NSLog() NSDecimalNumber to po prostu wywołanie -description
, który nie ma kontekstu ustawień regionalnych i może drukować, mniej więcej, co chce.
Jeśli chcesz drukować prawidłowo sformatowane numery używać NSNumberFormatter tak:
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", number);
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
[formatter setLocale:locale];
NSLog(@"%@", [formatter stringFromNumber:number]);
Lub krótko
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]);
jeśli chcesz po prostu użyć bieżącego ustawienia regionalne.
Podsumowując:
- NSDecimalNumber jest tylko przechowywanie. Zalogowanie go nie odzwierciedla niczego na temat ustawień regionalnych.
- Aby NSDecimalNumber poprawnie zapisał numer, jego ustawienia regionalne muszą być zgodne z ustawieniami oczekiwanego wejścia (dobrym wyborem jest tutaj
-[NSLocale currentLocale]
).
- Aby wyświetlić numery poprawnie sformatowane dla danego regionu, użyj NSNumberFormatter.
Edit:
Ok, zrobiłem trochę więcej badań na ten temat.
W GNUStepie wygląda na to, że kończy się wartością NSDecimalSeparator
w NSUserDefaults
(z szybkiego przeglądania ich kodu).
Wykonanie pewnych eksperymentów odkryłem, że żaden z poniższych wpływać na zachowanie domyślne parsowania, o ile mogę powiedzieć:
NSDecimalSeparator
w NSUserDefaults
.
AppleLocale
w NSUserDefaults
.
NSLocaleCode
w NSUserDefaults
.
- Wartość ustawiona dla
CFBundleDevelopmentRegion
.
- Wartości środowiska
LANG
/LC_ALL
/etc ....
+[NSLocale systemLocale]
.
Oczywiście nie jest to +[NSLocale currentLocale]
, ponieważ to pytanie wynika z faktu, że aktualne ustawienia regionalne nie mają wpływu.
Pytanie nie dotyczy drukowania, jego informacji na temat parsowania. _ "pierwszy używa domyślnego ustawienia narodowego formatu (en_US) do parsowania" _ - Moje pytanie brzmi, dlaczego en_US jest domyślnym, gdy moje bieżące ustawienia narodowe to fr_FR. Kiedy więc dokumentacja mówi, że domyślne ustawienia regionalne zależą od tego, kiedy to się różni od en_US, jeśli nie, gdy moje bieżące locale to fr_FR? – thejaz
Dokumentacja nie wyjaśnia, co powoduje, że ustawienia narodowe stają się "domyślnymi" ustawieniami regionalnymi, chociaż wydaje się, że mogą się zmienić. Początkowo myślałem, że może to być związane z wartością ustawioną dla CFBundleDevelopmentRegion, która ["Zwykle odpowiada natywnemu językowi autora"] (https://developer.apple.com/library/ios/#documentation/General/Reference /InfoPlistKeyReference/Articles/CoreFoundationKeys.html), ale zmiana tej wartości nie miała żadnego wpływu na zachowanie. Jeśli API lub dokumentacja jest niejasna, najlepiej jest [złożyć radar] (https://bugreport.apple.com). – frozendevil
Złożyłem dokumentacyjny radar, który zachęcam do skopiowania (rdar: // 13520160, http://openradar.appspot.com/radar?id=2878409); Dodałem również nieco więcej informacji do mojej odpowiedzi. – frozendevil