27

ページ要素に他の影響を与えずに、html コンテンツのすべての数字をペルシャ数字に変換したいと考えています。

例えば:

<div style='color: #c2c2c2'>
  text number 1
  <span>text number 2</span>
  <div>
    text number 3
    <b>text number 4</b>
    <a href='#page2'>text number 5</a>
  </div>
</div>

に変換されます:

<div style='color: #c2c2c2'>
  text number ۱
  <span>text number ۲</span>
  <div>
    text number ۳
    <b>text number ۴</b>
    <a href='#page2'>text number ۵</a>
  </div>
</div>
let persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
let english = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

ありがとう。

4

13 に答える 13

32

この方法を使用できます: ( http://jsfiddle.net/A4NfG/1/ )

persian={0:'۰',1:'۱',2:'۲',3:'۳',4:'۴',5:'۵',6:'۶',7:'۷',8:'۸',9:'۹'};
function traverse(el){
    if(el.nodeType==3){
        var list=el.data.match(/[0-9]/g);
        if(list!=null && list.length!=0){
            for(var i=0;i<list.length;i++)
                el.data=el.data.replace(list[i],persian[list[i]]);
        }
    }
    for(var i=0;i<el.childNodes.length;i++){
        traverse(el.childNodes[i]);
    }
}
于 2013-03-06T13:26:32.080 に答える
7

あなたを助けるかもしれないこのfindAndReplaceDOMText.js があります。ドキュメント内のすべてのノード (すべての要素nodeTypeではなく) を調べ、引数が 3 ( TEXT_NODE ) の場合にテキストを置き換えます。

この例では、ページ全体の数字を置き換えます。

function walkNode(node) { 
    if (node.nodeType == 3) {
        // Do your replacement here
        node.data = node.data.replace(/\d/g,convert);
    }
        
    // Also replace text in child nodes
    for (var i = 0; i < node.childNodes.length; i++) {
        walkNode(node.childNodes[i]); 
    }
}
    
walkNode(document.getElementsByTagName('body')[0]);

function convert(a){
    return ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'][a];
}

こちらのJavaScriptString.replaceドキュメントを参照してください。

于 2013-03-06T13:05:59.940 に答える
5

この短くて簡単なコードを書きました。

// ES6
const regex = /[۰-۹]/g
let str = '۰۱۲۳۵۴۸۹۰۷۸۹۰۱۲';
let result = str.replace(regex, function (w) {
    return String.fromCharCode(w.charCodeAt(0) - 1728)
  }
)

console.log(result);

于 2016-11-14T22:15:05.490 に答える
1

を使用Number.toLocaleString()して、単一の数値を変換およびフォーマットできます。

let myNumberStr = "123456.7890";
let myNumber = Number(myNumberStr); // Convert from string to number
let persian = myNumber.toLocaleString("fa"); // OR "fa-IR" for IRAN

より高度で完全な答え (ページ内のすべての数値を変換する)

localizeNumbers(document.getElementsByTagName('body')[0]);

function localizeNumbers(node) { 
    if (node.nodeType == Node.TEXT_NODE) {
        // Use this if target numbers may contain comma as thousands separators
        node.data = node.data.replace(/([,\d]*\.?\d+)/g, localize);
        // Use this if you do not want to treat comma as thousands separator
        // node.data = node.data.replace(/(\d*\.?\d+)/g, localize);
    }
    // Also, replace numbers in child nodes
    node.childNodes.forEach(localizeNumbers);
}

function localize(numberString) {
  // Convert from string to number
  // Use this if target numbers may contain comma as thousands separators
  let number = Number(numberString.replace(/[^\d.]/g, ""));
  // Use this if you do not want to treat comma as thousands separator
  // let number = Number(numberString);

  // Could also have used "fa-IR" for IRAN
  let persian = number.toLocaleString("fa", { maximumFractionDigits: 10 });
  // Could also have used "en-US" for USA
  let english = number.toLocaleString("en", { maximumFractionDigits: 10 });
  // Could also have used "ar" (which seems to use western digits). "EG" is for Egypt
  let arabic = number.toLocaleString("ar-EG", { maximumFractionDigits: 10 });

  console.log(`Persian: ${persian}`);
  console.log(`English: ${english}`);
  console.log(`Arabic: ${arabic}\n`);

  return persian;
}

localizeNumbers(document.getElementsByTagName('body')[0]);

function localizeNumbers(node) { 
  if (node.nodeType == Node.TEXT_NODE) {
    node.data = node.data.replace(/([,\d]*\.?\d+)/g, localize);
  }
  node.childNodes.forEach(localizeNumbers);
}

function localize(numberString) {
  let number = Number(numberString.replace(/[^\d.]/g, ""));
  let persian = number.toLocaleString("fa", { maximumFractionDigits: 10 });
  let english = number.toLocaleString("en", { maximumFractionDigits: 10 });
  let arabic = number.toLocaleString("ar-EG", { maximumFractionDigits: 10 });

  console.log(`Persian: ${persian}`);
  console.log(`English: ${english}`);
  console.log(`Arabic: ${arabic}\n`);

  return persian;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<script src="script.js" defer></script>
</head>
<body>


  <div style='color: #c2c2c2'>
    text number 1
    <span>text number 2</span>
    <div>
      text number 3
      <b>text number 4</b>
      <a href='#page2'>text number 5</a>
    </div>
  </div>


  1234
  <div>
    1234
    <p>1234</p>
  </div>
  <p>1234</p>
  <p>1,234</p>
  <p>1234.5678</p>
  <p>1,234.5678</p>
  <p>0.1234</p>
  <p>.1234</p>
  <p>abc1234</p>
  <p>abc1,234</p>
  <p>abc1234def</p>
  <p>abc1,234def</p>
  <p>abc 1234def</p>
  <p>abc 1,234def</p>
  <p>abc 1234 def</p>
  <p>abc 1,234 def</p>
  <p>abc1234.567</p>
  <p>abc1,234.567</p>
  <p>abc1234.567def</p>
  <p>abc1,234.567def</p>
  <p>abc 1234.567def</p>
  <p>abc 1,234.567def</p>
  <p>abc 1234.567 def</p>
  <p>abc 1,234.567 def</p>
</body>
</html>

ノート

  1. ソリューションは、数値をStringではなくNumberとして扱います。のoptions オブジェクトで を指定しない場合、フォーマットされた数値は丸められる場合があります。この投稿を参照してください。maximumFractionDigitstoLocaleString

  2. 書式設定された数値で千単位の区切り記号を省略するにuseGrouping: falseは、 のオプション オブジェクトを追加しますtoLocaleStringMDN Web Docs: Intl.NumberFormat()およびW3Schools : JavaScript Number toLocaleString()を参照して、他のすべての使用可能なオプションを確認してください。

  3. このソリューションは、正しいペルシャ語の千単位の区切り記号小数点記号(momayyez と呼ばれる) を使用して数値をフォーマットします。デフォルトのブラウザー フォントと他のいくつかのフォントでは、これらの文字は両方ともラテン語のコンマ ( ) に似ているかもしれません,が、実際には 3 つの異なる Unicode 値を持つ 3 つの異なる文字です。

  4. このコードは、HTML 内のすべての元の数値が英語形式 (3 桁ごとの区切り記号にコンマ、10 進数の区切り記号にドットを使用) であることを前提としています。

ここでは、 Sjoerd answerの修正版を使用しました。彼の答えに感謝します。

さまざまな一般的な数字のリストについては、このウィキペディアの記事を参照してください。また、この投稿この投稿を参照してください。persian.js ライブラリを使用してこれをすべて行うこともできます。

于 2021-12-23T21:36:25.403 に答える