Τι είναι το «The Best» ΗΠΑ νομίσματος τυπική έκφραση;

ψήφοι
44

Μια γρήγορη αναζήτηση regex νόμισμα φέρνει πολλά αποτελέσματα .
MSDN χρησιμοποιεί ^ -; (. \ \ D {2}); \ d + $

Το πρόβλημα που έχω με την επιλογή ενός από αυτά είναι ότι regex είναι δύσκολο να εξακριβωθεί χωρίς έλεγχο όλες τις περιπτώσεις ακμής. Θα μπορούσα να ξοδεύουν πολύ χρόνο σε αυτό, όπως είμαι βέβαιος ότι εκατοντάδες άλλους προγραμματιστές έχουν ήδη γίνει.

Έτσι ... Υπάρχει κάποιος που έχει ένα regex για το αμερικανικό νόμισμα, που έχει δοκιμαστεί διεξοδικά ;

Η μόνη μου απαίτηση είναι ότι η συμφωνημένα string είναι το νόμισμα των ΗΠΑ και αναλύει σε System.Decimal :

[Ws] [σύμβολο] [ψηφία], ψηφία [.fractional-ψηφία] [ws] 

Στοιχεία σε αγκύλες ([και]) είναι προαιρετικές. 
Ο παρακάτω πίνακας περιγράφει κάθε στοιχείο. 

ΣΤΟΙΧΕΙΟ ΠΕΡΙΓΡΑΦΗ
ws προαιρετικό λευκό κενό.
υπογράψουν μια προαιρετική ένδειξη.
Ψηφία μια ακολουθία αριθμών που κυμαίνονται από 0 έως 9.
, Ένα σύμβολο διαχωριστικό χιλιάδων πολιτισμό ειδικά.
. Ένα σύμβολο υποδιαστολή πολιτισμό ειδικά.
κλασματική-ψηφία Μία ακολουθία ψηφίων που κυμαίνονται από 0 έως 9. 
Δημοσιεύθηκε 09/12/2008 στις 21:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


11 απαντήσεις

ψήφοι
72

Εδώ είναι μερικά πράγματα από τους δημιουργούς του Regex Buddy. Αυτά προήλθαν από τη βιβλιοθήκη, έτσι είμαι βέβαιος ότι έχουν ελεγχθεί διεξοδικά.

Αριθμός: ποσότητα νομίσματος (σεντ υποχρεωτικό) Προαιρετική διαχωριστικό χιλιάδων? υποχρεωτική διψήφιο ποσοστό

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$

Αριθμός: ποσότητα νομίσματος (σεντ προαιρετικά) Προαιρετικά χιλιάδες διαχωριστικά? προαιρετικό διψήφιο ποσοστό

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$

Αριθμός: ποσότητα νομίσματος των ΗΠΑ και της ΕΕ (σεντ προαιρετικό) Μπορεί να χρησιμοποιήσει αμερικανικού τύπου 123,456.78 σημειογραφία και ευρωπαϊκού στιλ 123.456,78 σημειογραφία. Προαιρετικά χιλιάδες διαχωριστές? προαιρετικό διψήφιο ποσοστό

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Απαντήθηκε 09/12/2008 στις 21:57
πηγή χρήστη

ψήφοι
12

Βρήκα αυτό κανονική έκφραση on line στο www.RegExLib.com από Kirk Fuller, Gregg Durishan

Έχω ήδη το χρησιμοποιεί με επιτυχία για τα τελευταία δύο χρόνια.

"^\$?\-?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))\)$"
Απαντήθηκε 09/12/2008 στις 22:20
πηγή χρήστη

ψήφοι
6

Δεν έχει δοκιμαστεί διεξοδικά σε όλα (έγραψα μόνο!), Αλλά φαίνεται να συμπεριφέρονται σωστά:

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

σετ δοκιμής:

0
1
33
555
4,656
4656
99,785
125,944
7,994,169
7994169
0.00
1.0
33.78795
555.12
4,656.489
99,785.01
125,944.100
-7,994,169
-7994169.23 // Borderline...

Wrong:
000
01
3,3
5.
555,
,656
99,78,5
1,25,944
--7,994,169
0.0,0
.10
33.787,95
4.656.489
99.785,01
1-125,944.1
-7,994E169

Σημείωση: System.Decimal σας είναι τοπικής ρύθμισης εξαρτώνται, σκληρά για να κάνουν το regex, εκτός ίσως όταν το κτίριο. Υπέθεσα ψηφία που ομαδοποιούνται ανά τρεις, ακόμη και αν σε ορισμένες καλλιέργειες (περιοχές) υπάρχουν διαφορετικοί κανόνες.
Είναι τετριμμένο να προσθέσετε κενά γύρω από αυτό.

Απαντήθηκε 09/12/2008 στις 22:52
πηγή χρήστη

ψήφοι
2

Η απάντηση της Keng είναι τέλεια, θα ήθελα απλώς να προσθέσω ότι για την εργασία με 1 ή 2 δεκαδικά ψηφία (για τρίτη έκδοση):

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

NET FIDDLE: https://dotnetfiddle.net/1mUpX2

Απαντήθηκε 15/12/2014 στις 19:16
πηγή χρήστη

ψήφοι
1

Αυτή η ερώτηση είναι λίγα χρόνια, γι 'αυτό ήθελε να δώσει μια ενημερωμένη απάντηση.

Έχω χρησιμοποιήσει jQuery InputMask και λειτουργεί πολύ καλά για είσοδο / μορφή κάλυψης (όπως αριθμούς τηλεφώνου, κλπ), αλλά δεν έχει πραγματικά λειτουργεί καλά για το νόμισμα από την εμπειρία μου.

Για νόμισμα, συστήνω ανεπιφύλακτα autoNumeric jQuery plugin. Είναι καλά διατηρημένα και έχουν ουσιαστικά «σκεφτεί τα πάντα» Θα μπορούσα να θέλετε για το νόμισμα.

Εγώ πραγματικά χρησιμοποιούν ένα συνδυασμό των δύο αυτών plugins για τη μορφοποίηση των αριθμών τηλεφώνου, μορφές αριθμών (ISBN, κ.λπ.), καθώς και νομίσματα (αμερικανικό νόμισμα ως επί το πλείστον).

Λάβετε υπόψη ότι jquery.inputmaskείναι ως επί το πλείστον για τον έλεγχο της μορφής ενός αξία του, ενώ autoNumericείναι περίπου ειδικά τον έλεγχο της μορφής του νομίσματος.

Απαντήθηκε 12/06/2016 στις 02:54
πηγή χρήστη

ψήφοι
0

Χρησιμοποιώντας απάντηση Leandro που θα προστεθεί ^(?:[$]|)στην αρχή να επιτρέψει την προηγούμενη σύμβολο του δολαρίου

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

Αυτό ταιριάζει

136,402.99
25.27
0.33
$584.56
1
00.2
3,254,546.00
$3,254,546.00
00.01
-0.25
+0.85
+100,052.00

Δεν ταιριαξε

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Απαντήθηκε 29/06/2018 στις 00:49
πηγή χρήστη

ψήφοι
0

Αυτό είναι ό, τι μπορώ να χρησιμοποιήσω:

Χωρίς κορυφαία + ή -

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

Με προαιρετικό ηγετική + ή -

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

καθαρό βιολί: https://jsfiddle.net/compsult/9of63cwk/12/

Απαντήθηκε 07/07/2016 στις 21:41
πηγή χρήστη

ψήφοι
0

Σε περίπτωση που θέλετε να λογοδοτήσουν για ανθρώπινο λάθος που θα μπορούσε να κάνει το το regex πιο επιεικής όταν ταιριάζουν νόμισμα. Θα χρησιμοποιηθεί για 2η ωραίο regex Κενγκ και έκανε λίγο πιο ισχυρή να λογοδοτήσουν για τυπογραφικό λάθος του.

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

Αυτό θα ταιριάξει με οποιαδήποτε από αυτές σωστή ή παραμορφωμένα σχήματα νόμισμα, αλλά να μην πάρει το επιπλέον σκουπίδια στο τέλος μετά το διάστημα:

$46,48382
$4,648,382
$ 4,648,382
$4,648,382.20
$4,648,382.2
$4,6483,82.20
$46,48382 70.25PD
$ 46,48382 70.25PD
Απαντήθηκε 05/01/2013 στις 18:15
πηγή χρήστη

ψήφοι
0

Είχα επιτυχία με αυτό (λαμβάνοντας κομμάτια από κάποια από τις παραπάνω regexs). Μόνο χειρίζεται μέχρι χιλιάδες, αλλά δεν πρέπει να είναι πάρα πολύ δύσκολο να επεκταθεί η

case class CurrencyValue(dollars:Int,cents:Int)
def cents = """[\.\,]""".r ~> """\d{0,2}""".r ^^ {
  _.toInt
}
def dollarAmount: Parser[Int] = """[1-9]{1}[0-9]{0,2}""".r ~ opt( """[\.\,]""".r ~> """\d{3}""".r) ^^ {
  case x ~ Some(y) => x.toInt * 1000 + y.toInt
  case x ~ None => x.toInt
}
def usCurrencyParser = """(\$\s*)?""".r ~> dollarAmount ~ opt(cents) <~ opt( """(?i)dollars?""".r) ^^ {
  case d ~ Some(change) => CurrencyValue(d, change)
  case d ~ None => CurrencyValue(d, 0)
}
Απαντήθηκε 12/12/2012 στις 18:35
πηγή χρήστη

ψήφοι
0

Είμαι χρησιμοποιώντας την ακόλουθη κανονική έκφραση για την επικύρωση νόμισμα:

^-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

Μπορείτε επίσης να επιτρέψουν προαιρετικά ηγετική σύμβολο του δολαρίου:

^\$?-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

Μπορείτε εύκολα να προσθέσετε δοκιμών για παρενθέσεις αντί να υπογράψει με την προσθήκη

\( and \)
Απαντήθηκε 29/11/2011 στις 14:15
πηγή χρήστη

ψήφοι
0

Έψαχνα σε αυτό το πάρα πολύ και έχουν καταλήξει στο συμπέρασμα ότι το καλύτερο είναι να οικοδομήσουμε την regex με βάση την τρέχουσα κουλτούρα. Μπορούμε να χρησιμοποιήσουμε το

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

ιδιότητες του NumberFormatInfoγια να πάρει την απαιτούμενη μορφή.

Επεξεργασία: κάτι σαν αυτό

NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + 
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + 
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" + 
                       (! symbolPrecedesIfPositive ? currencySymbol : ""); 

ανατρέξτε - http://msdn.microsoft.com/en-us/library/hs600312.aspx

Απαντήθηκε 25/08/2011 στις 07:57
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more