5

文を解析して数値を返すことができる JavaScript 関数を構築しようとしています。

これは、以下のテストケース用にセットアップしたjsFiddleです-

  1. 「私は 1 ポンドあります」 -> 1
  2. 「私は使うべき£3.50を持っています」 -> 3.50
  3. 「私は 23.00 ポンドあります」 -> 23
  4. 「£27.33」 -> 27.33
  5. 「$4345.85」 -> 4345.85
  6. '3.00' -> 3
  7. '7.0' -> 7
  8. 「2.0 が必要です。」-> 2
  9. 「15.20 のはずです。」-> 15.20
  10. '3.15' -> 3.15
  11. 「私は5つしか持っていません。素晴らしいものではありません。」-> 5
  12. ' 34.23' -> 34.23
  13. 'sdfg545.14sdfg' -> 545.14
  14. 「昨日、私は 235468.13 ポンドを使いました。今日は、支出を減らしたいと思っています。-> 235468.13
  15. 「昨日、私は 340 ポンドを使いました。」-> 340
  16. 「今日は 14.52 ポンド、明日は 17.30 ポンドを使いました」 -> 14.52
  17. 「木が 0 本あります。明日は 11.33 ポンドです」 -> 0

16&17 は、最初の番号を見つける必要があることを示します。一部のテスト ケースが難しい場合があることは理解していますが、妥当な範囲をカバーできるものであれば何でも歓迎します。

これが私の関数に使用している形式です

function parseSentenceForNumber(sentence){

    return number; //The number from the string
}

私は自分で 60 ~ 80% を達成できると思いますが、ここでは正規表現が最善の解決策であると予想しています。十分な数のテスト ケースがあることを願っていますが、見逃した可能性のあるものを自由に追加してください。

あなたの助けに感謝します

**アップデート**

実用的な回答がたくさんあり、それらをより詳細に調べるために時間を費やす必要があります。Mike Samuel がコンマと .5 について言及したので、さらにいくつかのテスト ケースを追加することになりました。

18.「私は 1,000 ポンドを持っています」 -> 1000 19.「.5」 -> 0.5

そして jsalonen は、数値なしのテストケースを追加することに言及しました

20.「この文には数字が含まれていません」 -> null

これはjsalonen のソリューションを使用して更新されたフィドルです。仕様を変更しなければ 100% ですが、変更を加えれば 95% になります。カンマを使って 18 番の解決法を教えてくれる人はいますか?

**アップデート**

jsalonen の関数にコンマを削除するステートメントを追加したところ、100% になりました。

ここに最終関数があります

function parseSentenceForNumber(sentence){
    var matches = sentence.replace(/,/g, '').match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/);
    return matches && matches[0] || null;
}

そして最後のフィドル

助けてくれて本当に感謝しており、途中で正規表現の知識を向上させました. ありがとう

4

6 に答える 6

2

任意の桁数のすべての負数と正数に一致する答え:

function parseSentenceForNumber(sentence){
    var matches = sentence.match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/);
    return matches && matches[0] || null;
}

文字列に数字がない場合に何が起こるかをテストするなど、否定的なテスト ケースも追加することを検討してください。

test("Test parseSentenceForNumber('This sentence contains no numbers')", function() {
  equal( parseSentenceForNumber('This sentence contains no numbers'), null );
});

フルフィドル: http://jsfiddle.net/cvw8g/6/

于 2013-07-26T16:01:21.930 に答える
2

正規表現:

\d+(?:\.\d+)?

するべきです。

  • \d+一連の数字に一致します。
  • .\d+ は、小数点とそれに続く数字に一致します。
  • (?:...)?そのグループをオプションにします

これは、分数がすべてゼロである特別なケースを扱っておらず、結果に分数を含めたくない場合、正規表現では困難です (それができるかどうかはわかりませんが、私は'間違っていることが証明されることをいとわない)。数値とその中の小数を一致させた後、それを処理する方が簡単なはずです。

文字列内の数値を一致させたら、 を使用parseFloat()して数値に変換し、toFixed(2)小数点以下 2 桁を取得します。

于 2013-07-26T15:58:44.080 に答える
1

もう1つの可能な正規表現:

/\d+\.?\d{0,2}/

これの意味は:

  • \d: 1 つ以上の数字
  • \.?: ゼロまたは 1 つのピリオド
  • d{0,2}2桁まで

http://jsfiddle.net/cvw8g/7/

于 2013-07-26T16:02:26.200 に答える