Regular expression to match German number

前端 未结 5 1255
孤街浪徒
孤街浪徒 2020-12-03 19:26

I am wondering, how would regular expression for testing correct format of number for German culture would look like.

In German, comma is used as decimal mark and do

相关标签:
5条回答
  • 2020-12-03 20:12

    Try this it will match your inputs:

    ^(\d+\.)*\d+(,\d+)?
    
    0 讨论(0)
  • 2020-12-03 20:15

    This is the regex I would use:

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

    Regular expression visualization

    Debuggex Demo

    And this is a code example to interpret it as a valid floating point (notice the parseFloat() after the string replacements).

    Edit: as mentioned in Severin Klug's answer, the below code assumes that the numbers are known to be in German format. Attempting to "detect" whether a string contains a German format or US format number is not arbitrary and out of scope for this question. '1.234' is valid in both formats but with different actual values, without context it is impossible to know for sure which format was meant.

    var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89'];
    
    document.getElementById('out').value=numbers.map(function(str) {
      return parseFloat(str.replace(/\./g, '').replace(',', '.'));
    }).join('\n');
    <textarea id="out" rows="10" style="width:100%"></textarea>

    0 讨论(0)
  • 2020-12-03 20:19

    This regex should work :

    ([0-9]{1,3}(?:\.[0-9]{3})*(?:\,[0-9]+)?)
    
    0 讨论(0)
  • 2020-12-03 20:31

    A good regex would be something like this

    Regex regex = new Regex("-?\d{1,3}(?:\.\d{3})*(?:,\d+)?");
    Match match = regex.Match(input);
    Decimal result = Decimal.Zero;
    if (match.Success)
         result = Decimal.Parse(match.Value, new CultureInfo("de-DE"));
    

    The result is the german number as parsed value.

    0 讨论(0)
  • 2020-12-03 20:32

    I would have posted this as a comment, but I dont have enough reputation. @funkwurm, your post https://stackoverflow.com/a/28361329/7329611 contains javascript

    var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89', '1.2'];
    numbers.map(function(str) {
      return parseFloat(str.replace(/\./g, '').replace(',', '.'));
    }).join('\n');
    

    which should convert german numbers to english/international ones - which it does for every number with exactly three digits after a german thousands dot like the numbers you use in the example array. BUT - and there is the critical Use-Case-Error: it just deletes dots from any other string with not three digits after it aswell. So if you insert a string like '1.2' it returns 12, if you insert '1.23' it returns 123. And this is a very critical behaviour, if anyone just takes the above code snippet and thinks it'll convert any given number correctly into english ones. Because already correct english numbers will be corrupted! So be careful, please.

    0 讨论(0)
提交回复
热议问题