2016-12-16 8 views
1

NSStringとして入力された数値をNSLocaleに基づいてNSDecimalNumberに変換したいと思います。例えばロケールに基づいてNSStingをNSDecimalNumberに変換します

InputString => 110.50 
Current Locale => en_FI 
Expected output => 110.50 
Actual output => 110 

InputString => 110.50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110.50 



InputString => 110,50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110 


InputString => 110.50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110.50 

私はこれを達成するために、次のコードを使用していますが、その作業はありません。

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:self.amountTextField.text locale:[NSLocale currentLocale]]; 

上記のように、私は希望の出力ではありません。私はここで間違って何を考えている。

+0

なぜロケールの詳細を無視している場合は、localreを使用していますか? – Sulthan

+0

あなたはこの質問のタイトルをgoogleしましたか? – danh

答えて

0

私はdecimalSeparatorを自分でNumberFormatter Sを指定するように提案し、入力文字列にあなたがdecimalSeparatorで使用したのと同じ文字で,.を交換してください。

import Foundation 

let formatter = NumberFormatter() 
formatter.numberStyle = .decimal 

func cleanNumberString(with string: String) -> String { 
    let knownDecimalSeparators = [",", "."] 
    let localSeparator = formatter.decimalSeparator ?? "." 
    var cleanString = string; 
    for separator in knownDecimalSeparators { 
     cleanString = cleanString.replacingOccurrences(of: separator, with: localSeparator) 
    } 
    return cleanString 
} 

func number(with string: String) -> Double { 
    let cleanString = cleanNumberString(with: string) 
    let number = formatter.number(from: cleanString) 
    return number?.doubleValue ?? 0 
} 

let string1 = "14,4" 
let string2 = "14.4" 

let cleanString1 = cleanNumberString(with: string1) 
let cleanString2 = cleanNumberString(with: string2) 

let number1 = number(with: string1) 
let number2 = number(with: string2) 
Objective-Cでは同じ

@interface CleanNumberFormatter() 

@property (nonatomic) NSNumberFormatter *formatter; 

@end 

@implementation CleanNumberFormatter 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     self.formatter = [NSNumberFormatter new]; 
     self.formatter.numberStyle = NSNumberFormatterDecimalStyle; 
    } 
    return self; 
} 

- (NSString *)cleanNumberStringWithString:(NSString *)string 
{ 
    NSArray *knownDecimalSeparators = @[@",", @"."]; 
    NSString *localSeparator = self.formatter.decimalSeparator ?: @","; 
    NSString *cleanString = [string copy]; 
    for (NSString *separator in knownDecimalSeparators) { 
     cleanString = [cleanString stringByReplacingOccurrencesOfString:separator withString:localSeparator]; 
    } 
    return cleanString; 
} 

- (double)numberWithString:(NSString *)string 
{ 
    NSString *cleanString = [self cleanNumberStringWithString:string]; 
    double number = [self.formatter numberFromString:cleanString].doubleValue; 
    return number; 
} 

- (void)foo 
{ 
    NSString *string1 = @"14.4"; 
    NSString *string2 = @"14,4"; 

    NSString *cleanString1 = [self cleanNumberStringWithString:string1]; 
    NSString *cleanString2 = [self cleanNumberStringWithString:string2]; 

    double number1 = [self numberWithString:string1]; 
    double number2 = [self numberWithString:string2]; 
} 

@end 
+0

小数点区切り文字をハードコードしたくない、デバイスロケールから取得したい – Madu

+0

'en_FI'の@Madu小数点区切り記号は'、 'ですが、入力文字列には' .'です。したがって、あなたの例では、すべてが期待通りに機能します。 –

+0

デバイスのロケールがen_FIで、ユーザーが110.25と入力した場合はどうしたらいいですか?正しく変更すると、110の代わりに110.25が返されます – Madu

0

期待される出力を有していない数字のみではなく、期間のコンマ、代わりに入力にコンマの周期を有します。それを置き換え、いくつかの地元の人々が異なる小数点区切り記号を使用するように動作するかどうかを確認してください。

+0

これは、ユーザデバイスのロケールが米国で、EUの国別フォーマットで番号を入力すると、その番号をデバイスのロケール形式に変更する必要があります。 – Madu

+0

申し訳ありませんが、私はあなたの質問を正しく理解していませんでした。あなたの文字列を見て、ロケールに応じて区切り記号を置き換えることができますか?セパレータが正しいものでない場合は、ロケール自体が小数点を無視するためです。数値に変換する前に独自のメソッドを追加することが最適なオプションかもしれません。 –

関連する問題