2009-10-10 12 views
5

Sto cercando una RegEx per i prezzi. Quindi dovrebbero essere i numeri X davanti, che un "," e alla fine 2 numeri max.RegEx per i prezzi?

Qualcuno può supportarmi e postarlo per favore?

+0

Non ci sono valute là fuori che hanno bisogno di 3 cifre decimali, anche il dollaro e l'euro hanno bisogno di 3 cifre decimali in alcuni scenari. –

+1

@AlixAxel Quando il dollaro e l'euro hanno bisogno di tre cifre dopo la virgola? – Tim

+1

@TimN: AFAIK, tutti i paesi dell'UE devono calcolare i prezzi del gas con una precisione di 3 cifre. Un altro esempio: tassi di cambio Forex (5 posizioni decimali credo). –

risposta

14

In che lingua hai intenzione di usarlo?

Dovrebbe essere qualcosa di simile:

^\d+(,\d{1,2})?$ 

analitico:

un numero X di fronte è: ^\d+ dove ^ significa l'inizio della stringa, \d significa una cifra e + significa uno o altro

Utilizziamo il gruppo () con un punto interrogativo, un ? significa: matc h cosa c'è dentro il gruppo una o nessuna volta.

all'interno del gruppo c'è ,\d{1,2}, il , è la virgola che hai scritto, \d è ancora una cifra {1,2} significa corrisponde alla cifra precedente una o due volte.

L'ultimo $ corrisponde alla fine della stringa.

3
^\d+,\d{1,2}$ 
+0

il tuo è migliore. Sto cercando di ottenere decimali opzionali –

-4

qualsiasi cosa come \ d +, \ d {2} è errato perché \ d corrisponde a [0-9 \.] Vale 12.34,1.

dovrebbe essere: [0-9] + [0-9] {2} (o [0-9] + [0-9] {1,2} per consentire luogo soltanto 1 decimale)

+0

No, \ d non corrisponde a '.', È lo stesso di [0-9] –

+0

Sbagliato. \ d è l'abbreviazione di [0-9] http://www.regular-expressions.info/charclass.html – Amarghosh

+0

@Amarghosh Anche questo non è vero. Corrisponde a diversi caratteri Unicode aggiuntivi. – Tim

4

Quindi mi sono imbattuto in un problema simile, che ha bisogno di convalidare se una stringa arbitraria è un prezzo, ma ha bisogno di molta più resilienza rispetto alle espressioni regolari fornite in questo thread e molti altri thread.

avevo bisogno di un'espressione regolare che hanno tutte le seguenti:

  • 5,00
  • 1.000
  • 1,000,000.99
  • 5,99 (prezzo europeo)
  • 5.999, 99 (prezzo europeo)
  • 0,11
  • 0.00

E non per abbinare roba come indirizzi IP. Non riuscivo a capire una sola regex a che fare con la roba europea e non europea in un colpo solo così ho scritto un po 'di codice Ruby per normalizzare i prezzi:

if value =~ /^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/ 
    Float(value.delete(",")) 
elsif value =~ /^([1-9][0-9]{,2}(\.[0-9]{3})*|[0-9]+)(,[0-9]{1,9})?$/ 
    Float(value.delete(".").gsub(",", ".")) 
else 
    false 
end 

L'unica differenza tra le due regex è la cifra decimale scambiata e la virgola.Cercherò di abbattere ciò che questo sta facendo:

/^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/ 

La prima parte:

([1-9][0-9]{,2}(,[0-9]{3})* 

Questa è una dichiarazione di numeri che seguono questa forma: 1.000 1.000.000 100 12. Ma non è così consentire gli zeri iniziali. È per i numeri correttamente formattati che hanno gruppi di 3 numeri separati dal separatore delle migliaia.

Seconda parte:

[0-9]+ 

Proprio Trova ogni numero 1 o più volte. Si potrebbe fare questo 0 o più volte se si desidera far corrispondere: .11 .34 .00 ecc

L'ultima parte:

(\.[0-9]{1,9})? 

Questo è il posto po decimale. Perché fino a 9 numeri, chiedi? L'ho visto accadere. Questa regex dovrebbe essere in grado di gestire qualsiasi prezzo strano e meraviglioso che vede e ho visto alcuni rivenditori utilizzano fino a 9 cifre decimali nei prezzi. Di solito tutti gli 0, ma non vorremmo perdere i dati^_^

Speriamo che questo aiuti la prossima persona a venire avanti a dover elaborare stringhe di prezzo formattate arbitrariamente o in formato europeo o non europeo :)

0

\ d + ((, \ d +) +)? (. \ D +)? (. \ D +)? (, \ D +)?

per coprire tutte

  • 5,00

    1.000

    1,000,000.99

    5,99 (prezzo europeo)

    5.999,99 (prezzo europeo)

    0,11

    0,00

1

Attualmente sto lavorando su una piccola funzione che utilizza espressioni regolari per ottenere quantità di prezzo all'interno di una stringa:

private static String getPrice(String input) 
{ 
    String output = ""; 

    Pattern pattern = Pattern.compile("\\d{1,3}[,\\.]?(\\d{1,2})?"); 
    Matcher matcher = pattern.matcher(input); 
    if (matcher.find()) 
    { 
     output = matcher.group(0); 
    } 

    return output; 
} 

questo sembra funzionare con un piccolo prezzo (da 0,00 a 999,99) e varie valute:

$ 12,34 -> 12,34

$ 12,34 -> 12,34

$ 12,00 -> 12.00

$ 12 -> 12

12 € -> 12

12,11 € -> 12,11

12,999 € -> 12,99

12,9 € -> 12.9

£ 999,99 € -> 999,99

...

0.123.516,41 mila
0

^[0-9] + [0-9] {2} $

qui è quella che consente di:.??

0,12, 12,01, ecc

e lo fa non consentire 12., 12.1, 19.0.0 ecc.

8

Non ero soddisfatto delle risposte precedenti. Ecco il mio prendere su di esso:

\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2}) 

|^^^^^^|^^^^^^^^^^^^^|^^^^^^^^^^^| 
| 1-3 | 3 digits | 2 digits | 
|digits| repeat any |   | 
|  | no. of  |   | 
|  | times  |   | 

(ottenere una spiegazione dettagliata qui: https://regex101.com/r/cG6iO8/1)

copre tutti i casi al di sotto

  • 5,00
  • 1.000
  • 1,000,000.99
  • 5 99 (prezzo europeo)
  • 5.999,99 (prezzo europeo)
  • 0,11
  • 0,00

Ma anche cose strane come

  • 5.000,000.00

Nel caso in cui si desidera includere 5 e 1000 (Personalmente non mi piaceva abbinare TUTTI i numeri), quindi basta aggiungere un "?" così:

\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})? 
4

Sto lavorando su un problema simile. Tuttavia voglio solo abbinare se un simbolo di valuta o una stringa è inclusa nella stringa come EUR, €, USD o $. Il simbolo potrebbe essere il trailing o il leader. Non mi interessa se c'è spazio tra il numero e la sottostringa della valuta. Ho basato la corrispondenza del numero nella discussione precedente e ho usato il numero di prezzo: \ d {1,3} (?: [.,] \ D {3}) * (?: [.,] \ D {2})?

Ecco risultato finale:

(USD|EUR|€|\$)\s?(\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2}))|(\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})?)\s?(USD|EUR|€|\$) 

Io uso (\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})?)\s?(USD|EUR|€|\$) come un modello per abbinare contro un simbolo di valuta (in questo caso con tolleranza per uno spazio iniziale).Penso che si può facilmente modificarlo per eventuali altre valute

A Gist con l'ultima versione può essere trovato alla https://gist.github.com/wischweh/b6c0ac878913cca8b1ba

+0

nessuna corrispondenza trovata per es. 1400,45 € o 12345 € -> https://regex101.com/r/LysWSP/2 –

0

Questo codice ha funzionato per me !! (PHP)

preg_match_all('/\d+((,\d+)+)?(.\d+)?(.\d+)?(,\d+)?/',$price[1]->plaintext,$lPrices); 
0

Questo ragionevolmente funziona quando si può o non può avere parte decimale, ma una quantità spettacoli in questo modo 100.000 - o 100.000,00. Testato con Clojure solo

\ d {1,3} (:? [.,] \ D {3}) * (:? [.,] \ D {2,3})

Problemi correlati