城市FR格式化案例

城市FR格式化案例

问题描述:

我搜索一个函数,可以将用户的输入转换为具有特定规则的新输出。城市FR格式化案例

这条规则是:

  • 第一个字母大写(如:P ARIS)

  • 如果字符串包含两个破折号( - ),每个字之间,适用于首字母大写第二个字(例如:Saint-E tienne)

  • 如果字符串包含以下特定字词:au,破折号,etsur ...两者之间( - ),应用小写上的论文单词的第一个字母(如:圣Etienne- 一个 UX-寺庙)

  • 如果字符串包含一个字单引号为:l'eveque ...在两个破折号( - )之间,在单词的单引号后面的第一个字母和一个大写字母上应用小写字母(例如:parigné-l'Evèque)。

这也太硬任务我,但我发现这个功能,尊重第一和第二条规则,但不是第三和第四条规则:

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

有人可以帮我补充这个函数的最后一个规则?

谢谢

+0

@ HemanGandhi该程序适用于规则1和规则2罚款。但没有规则3和4。尝试写:巴黎l'eveque。该程序必须将字符串转换为:Paris-l'Eveque(规则3)。试着写下:paris-aux-anges,程序必须将字符串转换为:Paris-aux-Anges。 (第4条)。 thx –

+0

Vilela Pinto,是的,我不舒服。我认为你的编号列表是测试用例之一。抱歉。 –

+0

第三条规则有多少具体词汇? –

所以我想出了这个用splitjoin。它似乎处理所有的情况。

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近乎完美!我使用这个程序每个keyup和keydown。所以当我写这个:paris-我有一个“无法读取属性”toUpperCase'未定义“在控制台上。该功能似乎不喜欢用户的输入。是因为'破折号'之后没有更多信件了? –

+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 if(exclude.some(function(e){e.toUpperCase()== wd.toUpperCase()})'等,这样'exclude'只能有小写值。 –