2016-12-01 8 views
1

私は入力文字列(アラビア数字)をint値に変換する関数を持っています。私は次の関数でこれを行います。入力がシーケンシャルでないときに文字列をintに変換する

function convertToEnglishDigit(input) { 
    var numberMap = { 
     '۰': '0', 
     '۱': '1', 
     '۲': '2', 
     '۳': '3', 
     '۴': '4', 
     '۵': '5', 
     '۶': '6', 
     '۷': '7', 
     '۸': '8', 
     '۹': '9',   
    }; 
    var result = parseInt(input.replace(/[۰-۹]/g, function(i) { 
     return numberMap[i]; 
    })); 

    return result; 
} 

入力は単一な'۲'などの文字、または文字列は、'۱۲۳۴۵'として連続している場合のいずれかである場合、それは動作します。入力が"٢١٠"のような順番の違う文字列の場合、replace()の戻り値はNaNです。なぜこれが問題なのですか?また、どのように順不同なのかを説明することができます。ほとんどいつもあるでしょう。

+0

http://stackoverflow.com/questions/1675786/convert-from-english-digits-to-arabic-ones-in-html-pageこのはず助けてください –

+0

これらの文字はFirebugのために本当に混乱しています:) – Pointy

答えて

1

何らかの理由で、正規表現はそれらのリテラル文字によって非常に混同されます。あなたはそれがそれらの数字のための16進コードを使用して動作させることができます。

function convertToEnglishDigit(input) { 
    var numberMap = { 
     '\u0660': '0', 
     '\u0661': '1', 
     '\u0662': '2', 
     '\u0663': '3', 
     '\u0664': '4', 
     '\u0665': '5', 
     '\u0666': '6', 
     '\u0667': '7', 
     '\u0668': '8', 
     '\u0669': '9'   
    }; 
    var result = parseInt(input.replace(/[\u0660-\u0669]/g, function(i) { 
     return numberMap[i]; 
    })); 

    return result; 
} 
+0

Good Find!私はオブジェクトの値をマップする必要があるかどうかは不思議です。数字の文字列を使用しているだけで、置換の16進コードで十分です。 –

+0

どのように私はこのメソッドで浮動小数点数を処理することができますか? –

+0

@Stavros_Sよく表記によります。小数点などの文字が異なる以外は、西洋表記法と似ていると、プロセスはほぼ同じになります。 – Pointy

1

私はこのアルファベットに慣れていないですが、それは右の出力を与えることに思えるとしてあなたは、このいずれかを試すことができます。より効率的にコードを修正することができます。

function convertToEnglishDigit(input){ 
var digit = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹']; 
var store = ''; 
for(var i = 0; i < input.length; i++){ 
    for(var j = 0; j < 10; j++){ 
     if(input[i] === digit[j]) store +=j; 
} 
} 
return parseInt(store); 
} 

出力:

convertToEnglishDigit('۰۱۲۹') 
129 
convertToEnglishDigit('۰۸۹۲۳۴') 
89234 
convertToEnglishDigit('۶۱۹۰') 
6190 
convertToEnglishDigit('۲۱۰') 
210 
関連する問題