2010-07-08 6 views

Odpowiedz

15

Nie. Usuń przecinek.

+7

To nie jest wielka odpowiedź, patrz odpowiedź 999 poniżej, która faktycznie pomaga. http://stackoverflow.com/a/3205751/111757 – Vicer

+2

@Vicer: Ściśle mówiąc, * odpowiedź 999 * nie jest odpowiedzią na * to * konkretne pytanie: OP już wie, jak usunąć przecinki ze strun i pytając, czy istnieje inna technika. A odpowiedź brzmiała "nie". W przypadku przyszłych użytkowników, którzy * nie * wiedzą, jak usunąć przecinki, odpowiedź 999 jest zdecydowanie bardziej pomocna, nawet jeśli nie odpowiada na oryginalne pytanie. Ale hej. Ponieważ jedynymi osobami, które już odwiedzą tę stronę, są Googling, jak radzić sobie z liczbami z przecinkami, jego zdecydowanie jest lepszą odpowiedzią dla wszystkich przyszłych widzów. – Matchu

+2

@Matchu Niekoniecznie, przyszedłem poszukać bardzo zwięzłej odpowiedzi (tak myślę, technicznie, miałem to samo pytanie co OP). W moim przypadku twoja odpowiedź stanowiła zarówno celność, jak i zwięzłość (wydaje się, że PO będzie się zgadzał). W każdym razie, mówiąc po prostu dla niektórych z nas "przyszłych widzów", ta odpowiedź jest jeszcze lepsza niż 999 (stąd mój głos). Spodziewałbym się, że gdyby ktoś nie wiedział, jak zastąpić przecinki, byliby to Google i nigdy nie zobaczą tej strony z dużym prawdopodobieństwem. W moim przypadku, mimo że skorzystałem z wyszukiwarki Google i uznałem, że tytuł tej strony pasuje, całkiem blisko, mój tekst wyszukiwania. Thnx! – VoidKing

72
parseFloat(theString.replace(/,/g,'')); 
+17

Proszę nie używać wyrażeń regularnych. '.replace (',', '')' – Dogbert

+0

Powiedział także, że rozważa usunięcie przecinka, ale interesują go inne sposoby. –

+26

@Adam, załóżmy, że liczba wynosi 1 milion, '" 1,000,000 "', jeśli nie użyj wyrażenia regularnego z flagą globalną, tylko pierwszy przecinek zostanie zastąpiony -> '" 1000,000 "'. – CMS

6

Możesz użyć metody zamiany ciągów, ale nie w jednej linijce, jak pozwala na to wyrażenie regularne.

while(str.indexOf(',')!=-1)str= str.replace(',',''); 
parseFloat(str); 

lub złożyć pojedynczy wyraz bez regexp =

return parseFloat(str.split(',').join('')); 

Chciałbym użyć wyrażenia regularnego.

0

Opierając się na idei z @kennebec, jeśli chcesz, aby upewnić się, że przecinki są poprawne, i nie chcesz, aby zastąpić przecinki, można spróbować czegoś takiego:

function myParse(num) { 
    var n2 = num.split(",") 
    out = 0 
    for(var i = 0; i < n2.length; i++) { 
    out *= 1000; 
    out += parseFloat(n2[i]) 
    } 
    return out 
} 
alert(myParse("1,432,85")); 
// Returns 1432085, as the comma is misplaced. 

Może ona nie być tak szybkie, ale chciałeś alternatywy :)

0

Co z prostą funkcją rozwiązania większości typowych problemów?

function getValue(obj) { 
    Value = parseFloat($(obj).val().replace(/,/g,'')).toFixed(2); 
    return +Value; 
} 

Powyższa funkcja pobiera wartości z pól (jQuery) zakładając, że podane wartości są numeryczne (I raczej walidacji pól natomiast użytkownik wprowadza dane, więc wiem na pewno jest zawartość pola numeryczne).

W przypadku wartości zmiennoprzecinkowych, jeśli dobrze sformatowane w polu, funkcja zwróci wartość zmiennoprzecinkową poprawnie.

Funkcja ta jest daleka od zakończenia, ale to szybko naprawić „,” (przecinek) wydać na wartościach wprowadzonych jako 1,234.56 lub 1,234,567. Zwróci poprawną liczbę, o ile zawartość jest numeryczna.

+ (Plus) znak przed zmienną Wartość w polecenia powrotnej jest „brudny trik” stosowane w JavaScript, aby zapewnić zmienną zawartość zwracana będzie numeryczny.

łatwo zmodyfikować funkcję do innych celów, takich jak (na przykład), konwertowanie ciągi do wartości liczbowych dbanie o „,” (przecinkami) Emisja:

function parseValue(str) { 
    Value = parseFloat(str.replace(/,/g,'')).toFixed(2); 
    return +Value; 
} 

Obie operacje można nawet łączyć w jedną funkcję. To znaczy.:

function parseNumber(item,isField=false) { 
    Value = (isField) ? parseFloat($(item).val().replace(/,/g,'')).toFixed(2) : parseFloat(item.replace(/,/g,'')).toFixed(2) 
    return +Value; 
} 

W takim przypadku, jeżeli jest wywoływana wynik = parseNumber ('12, 092,98'); będzie analizować wartość, ponieważ jest ciągiem. Ale jeśli jest wywołany jako result = parseNumber ('# MyField', true); spróbuje uzyskać wartość od "#MyField".

Tak jak wspomniałem wcześniej, takie funkcje są dalekie od zakończenia i mogą być rozszerzane na wiele sposobów. Jednym z pomysłów jest sprawdzenie pierwszego znaku danego parametru (łańcucha) i podjęcie decyzji w oparciu o format ciągu, w którym można uzyskać wartość do przeanalizowania (jeśli 1. znak to = "# ' to jest to identyfikator z obiektu DOM , w przeciwnym razie, jeśli zaczyna się od liczby, musi być przetwarzany string, który ma być przetwarzany).

Wypróbuj ... Szczęśliwe kodowanie.

14

nie wiem dlaczego nikt nie zasugerował to expression-

parseFloat(theString.replace(/[^\d\.]/g,'')); 

Usuwa wszystkie znaki nienumeryczne z wyjątkiem okresów. Do tego też nie potrzebujesz niestandardowych funkcji/pętli, to tylko przesada.

+0

najprostsze rozwiązanie! – Ray

+1

Dzięki! To również zajęło się "$". Niezła odpowiedź :-) – hardba11

2

nie mam wystarczająco dużo reputacji, aby dodać komentarz, ale dla każdego, zastanawiając się na wykonywaniu dla regex vs split/join, oto szybkie skrzypce: https://jsfiddle.net/uh3mmgru/

var test = "1,123,214.19"; 

var t0 = performance.now(); 
for (var i = 0; i < 1000000; i++) 
{ 
    var a = parseFloat(test.replace(/,/g,'')); 
} 
var t1 = performance.now(); 
document.write('Regex took: ' + (t1 - t0) + ' ms'); 
document.write('<br>') 

var t0 = performance.now(); 
for (var i = 0; i < 1000000; i++) 
{ 
    var b = parseFloat(test.split(',').join('')); 
} 
var t1 = performance.now(); 
document.write('Split/join took: ' + (t1 - t0) + ' ms'); 

Wyniki dostaję są (dla 1 milion pętle każda):

regex: 263.335 ms
split/join: 1035.875 ms

Więc myślę, że można powiedzieć, że regex jest do zrobienia w tym scenariuszu

Powiązane problemy