7

通貨記号の付いた文字列から数値(浮動小数点値)を取得しようとしています。

例えば。「¥1,234」から1234「AU$3,456」から3456「56.78€」から56.78

次のコードを試しましたが、結果として0になりました。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLenient:YES];
NSNumber *number = [formatter numberFromString:text];
NSDecimalNumber *money = [NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]];
float fval = [money floatValue];

前もって感謝します!

4

3 に答える 3

8

ここでの難しさは、通貨の小数点は国によって異なることです。さらに悪いことに、一部の地域で使用されている数字のグループ化記号は、他の地域では小数点として使用されています。見る:

http://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system

http://en.wikipedia.org/wiki/Decimalisation#Decimal_currency

したがって、小数点の記号に依存する、または疑わしい小数点マーカーの後に小数点以下の桁数を使用するという単純なアプローチは、100%正確ではない可能性があります。扱っている特定のサブセットがある場合は、必ず何らかのヒューリスティックを使用してください。

ただし、グローバルな問題領域を考えると、ロケールがあればそれを使用するのが最善の方法だと思います。

NSString* text =  @"$3,456.78 USD";
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
text = [text stringByReplacingOccurrencesOfString:formatter.internationalCurrencySymbol withString:@""];
float fval = [formatter numberFromString:text].floatValue;
于 2012-12-22T04:41:35.337 に答える
2

より効率的な方法があると確信していますが、次のことができます。

NSArray *strings = @[@"¥1,234",@"AU$3,456.78",@"56.78€"];

NSCharacterSet *nonNumbersSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];

for (NSString *string in strings)
{
    NSString *result = [string stringByTrimmingCharactersInSet:nonNumbersSet]; 
    result = [result stringByReplacingOccurrencesOfString:@"," withString:@""]; 
    CGFloat floatResult = [result floatValue];
    NSLog(@"%@ -> %.2f", result, floatResult);
}

または、スキャナーを使用できます。

NSArray *strings = @[@"¥1,234",@"AU$3,456.78",@"56.78€"];
NSCharacterSet *numbersSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789.,"];

for (NSString *string in strings)
{
    NSString *result;
    NSScanner *scanner = [NSScanner scannerWithString:string];
    [scanner scanUpToCharactersFromSet:numbersSet intoString:nil];
    [scanner scanCharactersFromSet:numbersSet intoString:&result];
    result = [result stringByReplacingOccurrencesOfString:@"," withString:@""];
    CGFloat floatResult = [result floatValue];
    NSLog(@"%@ -> %.2f", result, floatResult);
}

もちろん、これらは、数値が千単位の区切り文字としてコンマを使用していることを前提としています。

NSNumberFormatter:を使用することもできます

NSArray *strings = @[@"¥1,234",@"AU$3,456.78",@"56.78€"];
NSCharacterSet *nonNumbersSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789.,"] invertedSet];

for (NSString *string in strings)
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterDecimalStyle;
    NSString *result = [string stringByTrimmingCharactersInSet:nonNumbersSet];
    NSNumber *numberResult = [formatter numberFromString:result];
    NSLog(@"%@ -> %.2f", result, [numberResult floatValue]);
}
于 2012-12-22T03:56:48.440 に答える
0

Swift4では

extension String
{
    var asDoubleValue:Double {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = Locale(identifier: "en_IN")
        let noSymbolText = self.replacingOccurrences(of: formatter.internationalCurrencySymbol, with: "")
        guard let DoubleNumber=formatter.number(from: noSymbolText) as? Double else {
            return 0
        }

        return DoubleNumber
    }
}
于 2017-12-19T09:40:01.790 に答える