Mam ciągi, które zawierają tysiąc separatorów, jednak żadna funkcja string-to-liczba chce ją poprawnie spożywać (przy użyciu javascript). Myślę o "przygotowaniu" łańcuchu, rozbijając wszystkie tysiąc separatorów, pozostawiając cokolwiek innego, nieokreślone i pozwalające Number / parseInt / parseFloat / {x2}} (Jestem zadowolony z ich zachowań inaczej) zdecydować resztę. Ale wydaje mi się, że nie mam pojęcia, który regexp może to zrobić!

Lepsze pomysły też są mile widziane!


AKTUALIZACJA:

Przepraszamy, odpowiedzi oświecone, jak bardzo sformułowane jest pytanie. To triyng, aby osiągnąć: 1), aby usunąć tysiąc separatorów tylko wtedy, ale 2), aby nie zakłócić oryginalnego ciągu dużo, więc dostanę Nan w przypadkach nieprawidłowych cyfr.

Więcej aktualizacji:

JavaScript jest ograniczony do angielskich miejscowości do analizowania, więc pozwala założyć, że tysiąc separatora jest "," dla prostoty (naturalnie, nigdy nie pasuje do separatora dziesiętnego w żadnej okolicy, więc zmieniając się do jakichkolwiek innych miejsc regionalnych nie powinny stanowić problemu)

Teraz, na funkcjach parsowania:

parseFloat('1023.95BARGAIN BYTES!')  // parseXXX functions just "gives up" on invalid chars and returns 1023.95
Number('1023.95BARGAIN BYTES!')      // while Number constructor behaves "strictly" and will return NaN

Czasami używam luźnego, czasem surowego. Chcę wymyślić najlepsze podejście do przygotowywania ciągów dla obu funkcji.

W przypadku ważności cyfr:

'1,023.99' jest doskonale uformowany angielski numer, a rozebranie wszystkich przecinków doprowadzi do poprawnego wyniku. '1,0,2,3.99' jest uszkodzony, jednak ogólne odpędzanie przecinków da '1023.99', które jest mało prawdopodobne, aby był prawidłowym wynikiem.

6
OnTheFly 19 listopad 2011, 00:27

7 odpowiedzi

Najlepsza odpowiedź

Welp, wzbudzę, aby rzucić moją sugestię do puli:

Uwaga: Zmienione

stringWithNumbers = stringwithNumbers.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");

Powinien się obracać

1,234,567.12
1,023.99
1,0,2,3.99
the dang thing costs $1,205!!
95,5,0,432
12345,0000
1,2345

W:

1234567.12
1023.99
1,0,2,3.99
the dang thing costs $1205!!
95,5,0432
12345,0000
1,2345

Mam nadzieję, że to przydatne!

EDYTUJ:

Istnieje dodatkowa zmiana, która może być konieczna, ale nie jest bez skutków ubocznych:

(\b\d{1,3}),(?=\d{3}(\D|$))

Zmienia to "jeden lub więcej" kwantyfikatora (+) dla pierwszego zestawu cyfr do kwantyfikatora "od jednego do trzech" ({1,3}) i dodaje twierdzenie "buntowe" przed nim. Uniemożliwi wymianę jak 1234,123 == & gt; 1234123. Jednakże uniemożliwi również wymianę, że może być pożądane (jeśli jest poprzedzona literą lub podkreśleniem), takim jak A123,789 lub _1,555 (co pozostanie niezmienione) .

7
Code Jockey 19 listopad 2011, 21:08

Prosty num.replace(/,/g, '') powinien być wystarczający, myślę.

4
J. K. 18 listopad 2011, 20:32

Zależy od tego, co jest twój tysiąc separatora

myString = myString.replace(/[ ,]/g, "");

Usunie spacje i przecinki.

2
flesk 18 listopad 2011, 20:32

To powinno działać dla Ciebie

var decimalCharacter = ".",
    regex = new RegExp("[\\d" + decimalCharacter + "]+", "g"),
    num = "10,0000,000,000.999";
+num.match(regex).join("");
1
Joe 18 listopad 2011, 20:48

Aby potwierdzić, że ciąg cyfr jest dobrze uformowany, użyj:

/^(\d*|\d{1,3}(,\d{3})+)($|[^\d])/.test(numeral_string)

Co powróci true, jeśli ciąg cyfr jest (1) tylko sekwencja zero lub więcej cyfr, lub (2) sekwencję cyfr z przecinkiem przed każdym zestawem trzech cyfr lub (3) z powyższych, a następnie nie-cyfrowy charakter i kto wie, co jeszcze. (Case # 3 jest dla pływaków, a także przykłady "bajtów okazyjnych!".)

Po potwierdzeniu tego użyj:

numeral_string.replace(/,/g, '')

Co zwróci kopię ciągów cyfrowych ze wszystkimi wycięciami przecinkami.

1
ruakh 18 listopad 2011, 21:51

Możesz użyć s.replaceAll("(\\W)(?=\\d{3})","");

Ten regex zdobądź cały znak alfanumeryczny z 3 znakami po nim.

Sznurki jak 4.444.444.444,00 € będą 4444444444,00 €

1
Angelo Moroni 12 wrzesień 2016, 17:56

Użyłem poniższych w ustawieniu komercyjnym i często pracował:

numberStr = numberStr.replace(/[. ,](\d\d\d\D|\d\d\d$)/g,'$1');

W powyższym przykładzie tysiące można oznaczyć dziesiętną, przecinką lub przestrzenią.

W niektórych przypadkach (jak cena 1000,5 euro) powyższa nie działa. Jeśli potrzebujesz czegoś bardziej solidnego, to powinno działać 100% czasu:

//convert a comma or space used as the cent placeholder to a decimal
$priceStr = $priceStr.replace(/[, ](\d\d$)/,'.$1');
$priceStr = $priceStr.replace(/[, ](\d$)/,'.$1');
//capture cents
var $hasCentsRegex = /[.]\d\d?$/;
if($hasCentsRegex.test($priceStr)) {
    var $matchArray = $priceStr.match(/(.*)([.]\d\d?$)/);
    var $priceBeforeCents = $matchArray[1];
    var $cents = $matchArray[2];    
} else{
    var $priceBeforeCents = $priceStr;
    var $cents = "";
}
//remove decimals, commas and whitespace from the pre-cent portion
$priceBeforeCents = $priceBeforeCents.replace(/[.\s,]/g,'');
//re-create the price by adding back the cents
$priceStr = $priceBeforeCents + $cents;
1
JohnP2 14 czerwiec 2017, 19:03