0

整数を自然言語の文に変換するクラスを作成しています。指定された数値が -9999 か​​ら 9999 の間であることを確認するために、いくつかの基本的なチェックが行われています。これはほとんどの場合うまくいくと思います。

ただし、プログラムが「this.convertSentence」に到達すると、try/catch ブロックとエラー チェックを通過すると、問題をさまざまな関数呼び出しに分解して、仕事が終わりました。

私が this.convertSentence でやろうとしていることは、数値のサイズなどをチェックしてから、数値を別の関数に送信してより多くの作業を行い、それらに文を伝播させて返すことです。クラス内だけで変数を使用する必要があるのか​​ 、それとも文を構築するために変数を渡す必要があるのか​​ どうかはわかりません。このようなことは私が疑問に思っています。

/**
*   A class for converting an integer to a natrual language sentence in Spanish.
*   Accepts integers from -9999 to 9999
*
*/
function NumberToWord () {

    this.getSentence = function(number) {

        // Check for erroneous input. Accepts only -9999 thru 9999 integers
        try
        {
            if(number === parseInt(number) && number > -10000 && number < 10000) {
                return this.convertSentence(number);
            } 
            else {
                throw new Error("Argument is not an integer between -9999 and 9999");
            }
        }
        catch(e){
            console.log(e.name + " " + e.message);
        }



    };

    this.convertSentence = function(number) {
        return "This is where I'll start the logic for the sentence";
    };

}


var numberToWord = new NumberToWord();




// Tests
console.log(numberToWord.getSentence(9999));
console.log(numberToWord.getSentence(-9999));
console.log(numberToWord.getSentence(10000));
console.log(numberToWord.getSentence(-10000));
console.log(numberToWord.getSentence(0));
console.log(numberToWord.getSentence(1.1));
console.log(numberToWord.getSentence(-9999.1));
console.log(numberToWord.getSentence(10001));
console.log(numberToWord.getSentence(-10001));
console.log(numberToWord.getSentence(5.5));
console.log(numberToWord.getSentence());
4

2 に答える 2

1

私があなたのコードで間違っていると思ったことがいくつかあります:

  1. クラスは必要ありません。あなたは単に数字を文に変換したいだけです。関数を使用します。
  2. なぜ両方がgetSentence公開convertSentenceされているのですか?公開getSentenceする必要があります。
  3. クラスは(おそらく)一度だけインスタンス化されるので、シングルトンパターンを使用します。

私がすること:

  1. コードをモジュール化するため、モジュールパターンを使用します。
  2. 特定のタスクをさまざまな関数に委任できますが、それらはプライベート名前空間に保持されます。

コードは次のとおりです。

Number.prototype.toWord = function () {
    return function (lang) {
        var number = this.valueOf();

        if (parseInt(number) === number) {
            if (number < 10000 && number > 10000) {
                switch (lang) {
                case "es":
                    return toSpanish(number);
                case "en":
                default:
                    return toEnglish(number);                        
                }
            } else throw new RangeError("Expected an integer between ±10000.");
        } else throw new TypeError("Expected an integer.");
    };

    function toSpanish(number) {
        // convert the number to Spanish
    }

    function toEnglish(number) {
        // convert the number to English
    }
}();

次に、次のように使用できます。

var number = 1337;
alert(number.toWord("es"));

編集:私はあなたが望むことをする簡単な関数を書きました。しかし、それは英語です。私はスペイン語を知らないので、あなたはそれをあなた自身で実行しなければならないでしょう。デモは次のとおりです:http://jsfiddle.net/XKYhx/2/

于 2012-11-17T08:36:18.353 に答える
0

私の考えでは、文に必要な部分の数を確認し、部分文字列と一致する配列を作成することです。たとえば、とにかく英語で (私はスペイン語を話せません!)

自然言語として、(マイナス) xxx 1000 と xxx と言うでしょう。これは、疑似コードで、番号の最大/最小が ~10000 / ~-10000 であるためです。

    var sign = ""
    var wholeparts = new Array()
    var mantissaparts = new Array()
      if number < 0, 
      sign = "minus"
      number = math.abs(number) // turn the number into a positive number now we have the      sign
    var whole = math.floor(number) //get whole number 
    var mantissa = number - whole //get the after decimal part if exists
    if whole > 1000
      wholeparts.push(math.floor(whole/1000)) //get the thousands part 
      wholeparts.push(whole - parts[0]*1000) // add the hundreds
    else
      parts.push(whole)

 if mantissa.length > 0
   do something similar for the mantissa to the mantissaparts array.

At this point you would have the sentence structure broken down then:

string sentance:
 foreach (var part in wholeparts)
 stringify and check each number, converting to human words depending on index, ie "seven" or "seventy", add each to the string. 
  if wholeparts.length > 1 : sentence = sentence + " thousand and"

then if you had a mantissa, sentence = sentence + "point" .. then and the mantissa as natural language.

私が考えることができる最良の内訳は次のとおりです。

  • 数値 (整数または仮数) を配列に変換するメソッド、
  • 配列を自然言語に変換するメソッド。使用される異なる表現の整数または仮数のいずれかを示すパラメーターを使用します。
  • 文字列形式の数値を受け取り、自然言語で同等のものを返すメソッド

それが役立つことを願っています..その場で考えていました。

于 2012-11-17T08:24:52.547 に答える