розділити рядок навпіл за заданим індексом і повернути обидві частини


83

У мене є рядок, який мені потрібно розділити на заданий індекс, а потім повернути обидві частини, розділені комою. Наприклад:

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

Тому мені потрібно мати можливість розділити рядок на будь-який заданий індекс, а потім повернути обидві половини рядка. Вбудовані методи, здається, виконують розбиття, але повертають лише одну частину розбиття.

string.slice повертає лише вилучену частину рядка. string.split дозволяє розділити лише на символ, а не на індекс. string.substring робить те, що мені потрібно, але повертає лише підрядок string.substr дуже схожий - все ще повертає лише підрядок


2
Чи можете ви показати очікуваний результат?
Рохан Кумар

2
split()повертає масив рядків, як ви, безсумнівно, знаєте. Введіть код, який, здається, не працює для вас.
Вім Омбелець

Хіба це не просто сепаратор тисяч?
Jack

Ви дійсно хочете розділити або просто вставити роздільник тисяч. Якщо це тільки останнім, ви можете спробувати це: var n='1234567890'; alert(n.replace(/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g,'$&,'));. Посилання: safaribooksonline.com/library/view/regular-expressions-cookbook/…
Маннго,

будь ласка, проголосуйте: github.com/lodash/lodash/issues/3014
lonewarrior556

Відповіді:


107

Спробуйте це

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

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


17
Питання задавалось на 2 частини. Чи не варто повертатись [value.substring(0, index) ,value.substring(index)]?
Маннго

55

ES6 1-вкладиш

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

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


3

Ви можете легко розгорнути його, щоб розділити на кілька індексів і взяти масив або рядок

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



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;
 }

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);

0

Якщо елегантність коду вища за показник ефективності регулярного виразу, тоді

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

Є багато місця для подальшої модифікації регулярного виразу, щоб бути точнішим.

Якщо join()це не спрацьовує, можливо, вам доведеться використовувати mapіз закриттям, тоді інші відповіді тут можуть бути меншими за байт та лінійний шум.


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"] 

Для тих, хто хоче розділити текст на масив за допомогою індексу.


0

Якщо вам потрібен справді хакерський однорядковий рядок із використанням регулярних виразів та інтерпольованих рядків ...

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)));

Тут ми знаходимо idxth-у позицію з кінця, використовуючи огляд вперед і $якір, але ми також фіксуємо будь-яку кількість цих наборів позицій з кінця. Потім позицію замінюємо комою. Ми використовуємо gпрапор (глобальний), щоб він замінював усі випадки, а не лише перше знайдене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.