106

我有一个字符串,我需要在给定索引上拆分,然后返回两个部分,用逗号分隔。例如:

string: 8211 = 8,211
        98700 = 98,700

所以我需要能够在任何给定的索引上拆分字符串,然后返回字符串的两半。内置方法似乎执行拆分,但只返回拆分的一部分。

string.slice 只返回提取的部分字符串。string.split 只允许您拆分字符而不是索引 string.substring 可以满足我的需要,但只返回子字符串 string.substr 非常相似 - 仍然只返回子字符串

4

9 回答 9

127

Try this

function split_at_index(value, index)
{
 return value.substring(0, index) + "," + value.substring(index);
}

console.log(split_at_index('3123124', 2));

于 2013-05-08T13:22:57.757 回答
69

ES6 1 班轮

// :: splitAt = (number, any[] | string) => [any[] | string, any[] | string]
const splitAt = (index, xs) => [xs.slice(0, index), xs.slice(index)]

console.log(
  splitAt(1, 'foo'), // ["f", "oo"]
  splitAt(2, [1, 2, 3, 4]) // [[1, 2], [3, 4]]
)
  

于 2016-08-04T02:19:49.440 回答
12

您可以轻松扩展它以拆分多个索引,并采用数组或字符串

const splitOn = (slicable, ...indices) =>
  [0, ...indices].map((n, i, m) => slicable.slice(n, m[i + 1]));

splitOn('foo', 1);
// ["f", "oo"]

splitOn([1, 2, 3, 4], 2);
// [[1, 2], [3, 4]]

splitOn('fooBAr', 1, 4);
//  ["f", "ooB", "Ar"]

lodash 问题跟踪器:https ://github.com/lodash/lodash/issues/3014

打字稿:

const splitOn: {
  <T = string>(s: T, ...i: number[]): T[];
  <T extends any[]>(s: T, ...i: number[]): T[];
} = <T>(slicable: string | T[], ...indices: number[]) =>
  [0, ...indices].map((n, i, m) => slicable.slice(n, m[i + 1]));
于 2020-04-23T21:13:15.413 回答
3

您还可以使用数字格式化程序 JS,网址为

https://code.google.com/p/javascript-number-formatter/

格式选项

http://jsfiddle.net/chauhangs/hUE3h/

  format("##,###.", 98700)
  format("#,###.", 8211)
于 2013-05-08T13:32:33.527 回答
1

有这种东西吗?...

 function stringConverter(varString, varCommaPosition)
 {
   var stringArray = varString.split("");
   var outputString = '';
   for(var i=0;i<stringArray.length;i++)
   {
     if(i == varCommaPosition)
      {
        outputString = outputString + ',';
      }

     outputString = outputString + stringArray[i];
   }  

   return outputString;
 }
于 2013-05-08T13:39:45.803 回答
1

你也可以这样做。
https://jsfiddle.net/Devashish2910/8hbosLj3/1/#&togetherjs=iugeGcColp

var str, result;
str = prompt("Enter Any Number");

var valueSplit = function (value, length) {
    if (length < 7) {
        var index = length - 3;
        return str.slice(0, index) + ',' + str.slice(index);
    }
    else if (length < 10 && length > 6) {
        var index1, index2;
        index1 = length - 6;
        index2 = length - 3;
        return str.slice(0,index1) + "," + str.slice(index1,index2) + "," + str.slice(index2);
    }
}

result = valueSplit(str, str.length);
alert(result);
于 2017-05-20T00:13:48.470 回答
0
function splitText(value, index) {
  if (value.length < index) {return value;} 
  return [value.substring(0, index)].concat(splitText(value.substring(index), index));
}
console.log(splitText('this is a testing peace of text',10));
// ["this is a ", "testing pe", "ace of tex", "t"] 

对于那些想要使用索引将文本拆分为数组的人。

于 2020-02-02T12:22:39.653 回答
0

如果代码优雅的排名高于正则表达式的性能命中,那么

'1234567'.match(/^(.*)(.{3})/).slice(1).join(',')
=> "1234,567"

有很多空间可以进一步修改正则表达式以使其更精确。

如果join()不起作用,那么您可能需要使用map闭包,此时此处的其他答案可能是更少的字节和线路噪音。

于 2018-09-12T04:53:54.173 回答
-1

如果你想要一个使用正则表达式和内插字符串的真正 hacky 单行...

const splitString = (value, idx) => value.split(new RegExp(`(?<=^.{${idx}})`));
console.log(splitString('abcdefgh', 5));

此代码表示通过替换正则表达式中返回的值来拆分字符串。正则表达式返回一个位置,而不是一个字符,所以我们不会丢失初始字符串中的字符。它执行此操作的方式是通过后视和^锚点找到index字符串开头有字符的位置。


为了解决您提出的从末尾开始每隔三个位置添加逗号的问题,正则表达式会略有不同,我们将使用替换而不是拆分。

const values = [ 8211, 98700, 1234567890 ];
const addCommas = (value, idx) => value.replace(new RegExp(`(?=(.{${idx}})+$)`, 'g'), ',');

console.log(values.map(v => addCommas(v.toString(), 3)));

在这里,我们idx通过使用前瞻和$锚点找到从末尾开始的第 th 个位置,但我们也从末尾捕获任意数量的这些位置集。然后我们用逗号替换位置。我们使用g标志(全局),所以它会替换每一个出现,而不仅仅是第一个找到的。

于 2021-01-06T19:21:34.460 回答