城市FR格式化案例
我搜索一个函数,可以将用户的输入转换为具有特定规则的新输出。城市FR格式化案例
这条规则是:
第一个字母大写(如:P ARIS)
如果字符串包含两个破折号( - ),每个字之间,适用于首字母大写第二个字(例如:Saint-E tienne)
如果字符串包含以下特定字词:
au
,破折号,et
,sur
...两者之间( - ),应用小写上的论文单词的第一个字母(如:圣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();
});
}
- 输入:
paris
- - >输出:Paris
- 输入:
saint-etienne
--->输出:Saint-Etienne
- 输入:
saint-etienne-aux-Temples
--->输出:Saint-Etienne-aux-Temples
- 输入:
parigné-l'eveque
--->输出:Parigné-l'Eveque
有人可以帮我补充这个函数的最后一个规则?
谢谢
所以我想出了这个用split
和join
。它似乎处理所有的情况。
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('-');
}
对不起,我不知道如果正则表达式可以解决您的问题。
thk's近乎完美!我使用这个程序每个keyup和keydown。所以当我写这个:paris-我有一个“无法读取属性”toUpperCase'未定义“在控制台上。该功能似乎不喜欢用户的输入。是因为'破折号'之后没有更多信件了? –
刚刚编辑它...它现在应该工作... –
不是真的,我“砍死”你的解决方案,但我不知道它是否干净。 –
好的我编辑了@ 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有一个更清洁的解决方案,这是欢迎:)
也许'else if(exclude.some(function(e){e.toUpperCase()== wd.toUpperCase()})'等,这样'exclude'只能有小写值。 –
@ HemanGandhi该程序适用于规则1和规则2罚款。但没有规则3和4。尝试写:巴黎l'eveque。该程序必须将字符串转换为:Paris-l'Eveque(规则3)。试着写下:paris-aux-anges,程序必须将字符串转换为:Paris-aux-Anges。 (第4条)。 thx –
Vilela Pinto,是的,我不舒服。我认为你的编号列表是测试用例之一。抱歉。 –
第三条规则有多少具体词汇? –