2016-03-28 21 views
0

ユーザの入力を特定のルールで新しい出力として変換できる関数を検索します。都市FRフォーマッタの場合

この規則は次のとおりです。

  • 最初の文字を大文字(例:P ARIS)

  • が文字列が含まれている場合は2つのダッシュ - 各単語の間、最初の文字に大文字を適用します() 2番目の単語のau、:(例:Saint- E tienne)

  • 文字列は次のように特定の単語が含まれている場合、etsur ... 2間のダッシュ( - )は、論文の単語の最初の文字に小文字を適用します(例:サンEtienne- UX-寺院)

  • 文字列は単語とが含まれている場合小文字の最初の文字には大文字を、単語の一重引用符の直後には大文字を使用します(例:Parigné-l'Evèque)。l'eveque ...のように2つのダッシュ( - )の間に入力します。

これは私にとってあまりにも大変な作業ですが、私は第一及び第二のルールを尊重し、この機能ではなく、第三及び第四のルールが見つかりました:

function ucwords(str,force) { 
    str=force ? str.toLowerCase() : str; 
    return str.replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g, 
    function(firstLetter){ 
     return firstLetter.toUpperCase(); 
    }); 
} 
  1. を入力:paris- - >出力:Paris
  2. 入力:saint-etienne--->出力:Saint-Etienne
  3. 入力:saint-etienne-aux-Temples--->出力: Saint-Etienne-aux-Temples
  4. 入力:parigné-l'eveque--->出力:Parigné-l'Eveque

誰かがこの関数の最後のルールを追加するために私を助けることができますか?

は、だから私はsplitjoinを使用して、この思い付いたあなた

+0

@HemanGandhiプログラムはルール1とルール2でうまくいきます。しかし、ルール3と4ではうまくいきません:paris-l'eveque。プログラムは、Paris-l'Eveque(ルール3)のように文字列を変換する必要があります。次のように書いてみてください:paris-aux-anges、プログラムはParis-aux-Angesのような文字列を変換しなければなりません。 (ルール4)。 thx –

+0

ヴィレラピント、はい、私は気に入らない。あなたの番号付きリストがテストケースの1つだと思った。ごめんなさい。 –

+0

3番目のルールにはいくつの特定の単語がありますか? –

答えて

1

ありがとうございます。すべてのケースを処理するようです。

function myUC(str){ 
    var wds = str.split('-'); 
    var acc = []; 

    var exclude = ["aux", "au","et", "sur", "des", "le", "les"]; 

    wds.forEach(function(wd){ 
     if(wd.length == 0) 
      return; 
     else if(exclude.includes(wd)){ 
      acc.push(wd); 
     }else if(wd.indexOf("'") == 1){ 
      acc.push(wd[0].toLowerCase() + "'" + wd[2].toUpperCase() + wd.substr(3)); 
     }else{ 
      acc.push(wd[0].toUpperCase() + wd.substr(1)); 
     } 
    }); 

    return acc.join('-'); 
} 

私は申し訳ありませんが、私は正規表現があなたの問題を解決できるかどうかわかりません。

+0

thk'sはほぼ完璧です!私はこのプログラムをそれぞれのキーアップとキーダウンで使います。だから、私がこれを書いたとき、paris-私はコンソール上でUndefinedのUpperCaseにプロパティを読み込めませんでした。この関数はユーザーの入力が気に入らないようです。ダッシュの後にもう文字がないからでしょうか? –

+0

ちょうどそれを編集しました...今はうまくいくはずです... –

+0

本当に、私はあなたのソリューションを "ハッキング"しましたが、それがきれいであるかどうかはわかりません。 –

0

私は彼の解決策が文字列が完全に書かれている場合にのみ動作するので、私は@Heman Gandhiの答えを編集しました。

私の場合は、何か(キーボードを使用して)書き込むたびに文字列を計算します。私のハッキングソリューションです:私は二度同じ言葉を定義し好きではない

field.bind("keydown keypress", function (event) { 

    myUc(field.val()); 
}); 

function myUC(str){ 
    var wds = str.split('-'); 
    var acc = []; 

    var exclude = ["Aux","aux", 
        "Au","au", 
        "Et", "et", 
        "Sur","sur", 
        "Des","des", 
        "Le","le", 
        "Les","les"]; 

    wds.forEach(function(wd){ 

     if(wd.length == 0) 
      acc.push(wd[0]); 

     else if(exclude.includes(wd)){ 
      acc.push(wd.toLowerCase()); 

     } else if(wd.indexOf("'") == 1 && wd.length > 3) { 

      acc.push(wd[0].toLowerCase() + "'" + wd[2].toUpperCase() + wd.substr(3)); 

     } else { 

      acc.push(wd[0].toUpperCase() + wd.substr(1));        
     } 
    }); 

    return acc.join('-'); 
}; 

の配列を除外しますが、私は二つの条件によって無期限に、この機能のループをしない場合。 @Hemanがもっとクリーンな解決法を持っている場合、これは歓迎です:)

+0

'else(exclude.some(function(e){e.toUpperCase()== wd.toUpperCase()})'などのように、 'exclude'には小文字の値しか持たないようにすることもできます。 –