如何在Objective-C中将字符串中的英文数字转换为波斯/阿拉伯数字?

7

我有一个英文字符串,其中可能包含数字。但我希望将这些数字以波斯数字的形式打印在屏幕上。

例如,如果 NSString *foo = @"a string with numbers 1 2 3;"

那么输出应该是 a string with numbers ۱۲۳

我现在正在使用的代码是:

-(NSString *)convertEnNumberToFarsi:(NSString *) number{
    NSString *text;
    NSDecimalNumber *someNumber = [NSDecimalNumber decimalNumberWithString:number];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fa"];
   [formatter setLocale:gbLocale];
   text = [formatter stringFromNumber:someNumber];
   return text;
}

这个方法只能转换仅包含数字的字符串,但正如上面所提到的,我想转换任何可能包含或不包含数字的字符串。

我该如何实现这个?

10个回答

11

简单方法:

NSDictionary *numbersDictionary = @{@"1" : @"۱", @"2" : @"۲", @"3" : @"۳", @"4" : @"۴", @"5" : @"۵", @"6" : @"۶", @"7" : @"۷", @"8" : @"۸", @"9" : @"۹",@"0" : @"٠"};
for (NSString *key in numbersDictionary) {
  str = [str stringByReplacingOccurrencesOfString:key withString:numbersDictionary[key]];
}

更加灵活的本地化解决方案:

NSNumberFormatter *formatter = [NSNumberFormatter new];
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"ar"];
for (NSInteger i = 0; i < 10; i++) {
  NSNumber *num = @(i);
  str = [str stringByReplacingOccurrencesOfString:num.stringValue withString:[formatter stringFromNumber:num]];
}

注意:这段代码是没有使用集成开发环境编写的,可能存在语法错误。


10

在 Swift 3 中:

func convertEngNumToPersianNum(num: String)->String{
    let number = NSNumber(value: Int(num)!)
    let format = NumberFormatter()
    format.locale = Locale(identifier: "fa_IR")
    let faNumber = format.string(from: number)

    return faNumber!
}

在强制解包之前进行检查以避免崩溃。


6

Swift 3:

尽管其他回答是正确的,但在将 String 转换为 Int 时存在一些问题。

String 转换为 Int 会去除左侧的零,这并不好(特别是在转换手机号码和身份证号码时)。为避免此问题,我更喜欢将每个英文数字替换为波斯语。

static func convertToPersian(text : String)-> String {
    let numbersDictionary : Dictionary = ["0" : "۰","1" : "۱", "2" : "۲", "3" : "۳", "4" : "۴", "5" : "۵", "6" : "۶", "7" : "۷", "8" : "۸", "9" : "۹"]
    var str : String = text

    for (key,value) in numbersDictionary {
        str =  str.replacingOccurrences(of: key, with: value)
    }

    return str
}

这种方法也可以用于替换文本中的数字,而且不需要将纯数字转换成波斯语。


2

将数字转换为任何语言环境

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "ar")
if let localized = formatter.string(from: NSNumber(value: comp.0)) {
   return "\(localized)"
}

例子:

(lldb) po formatter.string(from: NSNumber(value: 0)) ▿ 可选项 - 一些 : "٠"

(lldb) po formatter.string(from: NSNumber(value: 1)) ▿ 可选项 - 一些 : "١"

(lldb) po formatter.string(from: NSNumber(value: 2)) ▿ 可选项 - 一些 : "٢"

(lldb) po formatter.string(from: NSNumber(value: 3)) ▿ 可选项 - 一些 : "٣"

(lldb) po formatter.string(from: NSNumber(value: 4)) ▿ 可选项 - 一些 : "٤"

(lldb) po formatter.string(from: NSNumber(value: 5)) ▿ 可选项 - 一些 : "٥"

(lldb) po formatter.string(from: NSNumber(value: 6)) ▿ 可选项 - 一些 : "٦"

(lldb) po formatter.string(from: NSNumber(value: 7)) ▿ 可选项 - 一些 : "٧"

(lldb) po formatter.string(from: NSNumber(value: 8)) ▿ 可选项 - 一些 : "٨"

(lldb) po formatter.string(from: NSNumber(value: 9)) ▿ 可选项 - 一些 : "٩"

(lldb) po formatter.string(from: NSNumber(value: 10)) ▿ 可选项 - 一些 : "١٠"

说明:这是一个在控制台中运行的代码示例,用于将数字转换为具有阿拉伯语数字形式的字符串。每个数字都对应不同的字符,其中“0”表示为“٠”,“1”表示为“١”,以此类推。

2

从任何语言到任何语言


您可以将任何语言中的数字转换为其他语言,例如:

"سلام 12345".convertedDigitsToLocale(Locale(identifier: "FA")) /* سلام ۱۲۳۴۵ */
"Hello ۱۲۳۴۵".convertedDigitsToLocale(Locale(identifier: "EN")) /* Hello 12345 */

这个扩展:

使用以下扩展:

extension String {
    private static let formatter = NumberFormatter()

    func clippingCharacters(in characterSet: CharacterSet) -> String {
        components(separatedBy: characterSet).joined()
    }

    func convertedDigitsToLocale(_ locale: Locale = .current) -> String {
        let digits = Set(clippingCharacters(in: CharacterSet.decimalDigits.inverted))
        guard !digits.isEmpty else { return self }

        Self.formatter.locale = locale
        let maps: [(original: String, converted: String)] = digits.map {
            let original = String($0)
            guard let digit = Self.formatter.number(from: String($0)) else {
                assertionFailure("Can not convert to number from: \(original)")
                return (original, original)
            }
            guard let localized = Self.formatter.string(from: digit) else {
                assertionFailure("Can not convert to string from: \(digit)")
                return (original, original)
            }
            return (original, localized)
        }

        var converted = self
        for map in maps { converted = converted.replacingOccurrences(of: map.original, with: map.converted) }
        return converted
    }
}

1
在 Swift 5 中
func getNumerals(num: Int) -> String {
    if getLanguage() == "ar" // You can set locale of your language
    {  
        let number = NSNumber(value: num)
        let format = NumberFormatter()
        format.locale = Locale(identifier: "ar") // You can set locale of your language
        let formatedNumber = format.string(from: number)
        return formatedNumber!
    } else {
        return "\(num)"
    }
}

0

恐怕除了替换它们,没有其他的方法了。

e.g.:

str =[str stringByReplacingOccurrencesOfString:@"0" withString:@"۰"];
.
.
.

0

Swift 5及以上版本

如果你想创建一个UILabel的子类:

class LocalizedNumbersLabel: UILabel {

override var text: String? {
    didSet {
        if let text = text {
            let numbersDictionary : Dictionary = ["0" : "۰","1" : "۱", "2" : "۲", "3" : "۳", "4" : "۴", "5" : "۵", "6" : "۶", "7" : "۷", "8" : "۸", "9" : "۹", "." : ","]
            var str = text

            for (key,value) in numbersDictionary {
                str =  str.replacingOccurrences(of: key, with: value)
            }
            if(str != self.text){
                self.text = str
            }
        } else {

        }
    }
}

}


0

/** * 这个函数用于将阿拉伯数字转换成英文数字。 * @sample stringValue : 传递字符串值。 */

fun numberArabicToEnglish(stringValue: String): String {
    val value = stringValue
        .replace("١", "1")
        .replace("٢", "2")
        .replace("٣", "3")
        .replace("٤", "4")
        .replace("٥", "5")
        .replace("٦", "6")
        .replace("٧", "7")
        .replace("٨", "8")
        .replace("٩", "9")
        .replace("٠", "0")
    return value
}`enter code here`

0
+(NSString *)convertNumToPersian:(NSString *)EnglishNumString
{
    if ( [EnglishNumString isEqual:[NSNull null]] )
        return @"";

    NSString *myString = [EnglishNumString stringByReplacingOccurrencesOfString:@"1" withString:@"۱"];
    myString = [myString stringByReplacingOccurrencesOfString:@"2" withString:@"۲"];
    myString =[myString stringByReplacingOccurrencesOfString:@"3" withString:@"۳"];
    myString =[myString stringByReplacingOccurrencesOfString:@"4" withString:@"۴"];
    myString =[myString stringByReplacingOccurrencesOfString:@"5" withString:@"۵"];
    myString =[myString stringByReplacingOccurrencesOfString:@"6" withString:@"۶"];
    myString =[myString stringByReplacingOccurrencesOfString:@"7" withString:@"۷"];
    myString =[myString stringByReplacingOccurrencesOfString:@"8" withString:@"۸"];
    myString =[myString stringByReplacingOccurrencesOfString:@"9" withString:@"۹"];
    myString =[myString stringByReplacingOccurrencesOfString:@"0" withString:@"۰"];
    return myString;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接