php – regex – как извлечь число с десятичной точкой (точка и запятая) из строки (например, 1,120.01)?

как извлечь число с десятичной точкой (точка и запятая) из строки (например, 1,120.01)? У меня есть регулярное выражение, но, похоже, не очень хорошо сочетается с запятыми

  preg_match ('/ ([0-9] + \. [0-9] +) /', $ s, $ matches); 

Правильное регулярное выражение для сопоставления чисел с запятыми и десятичными знаками выглядит следующим образом (первые два будут проверять правильность форматирования номера):


десятичная опция (два знака после запятой)

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

Визуализация регулярных выражений

Демоверсия Debuggex

Разъяснение:

 number (decimal required) ^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$ Options: case insensitive Assert position at the beginning of the string «^» Match a single character present in the list below «[+-]?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» The character “+” «+» The character “-” «-» Match a single character in the range between “0” and “9” «[0-9]{1,3}» Between one and 3 times, as many times as possible, giving back as needed (greedy) «{1,3}» Match the regular expression below «(?:,?[0-9]{3})*» Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» Match the character “,” literally «,?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» Match a single character in the range between “0” and “9” «[0-9]{3}» Exactly 3 times «{3}» Match the character “.” literally «\.» Match a single character in the range between “0” and “9” «[0-9]{2}» Exactly 2 times «{2}» Assert position at the end of the string (or before the line break at the end of the string, if any) «$» 

Будет матч:

 1,432.01 456.56 654,246.43 432 321,543 

Не будет соответствовать

 454325234.31 324,123.432 ,,,312,.32 123,.23 

десятичное обязательное (два десятичных знака)

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

Визуализация регулярных выражений

Демоверсия Debuggex

Разъяснение:

 number (decimal optional) ^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$ Options: case insensitive Assert position at the beginning of the string «^» Match a single character present in the list below «[+-]?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» The character “+” «+» The character “-” «-» Match a single character in the range between “0” and “9” «[0-9]{1,3}» Between one and 3 times, as many times as possible, giving back as needed (greedy) «{1,3}» Match the regular expression below «(?:,?[0-9]{3})*» Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» Match the character “,” literally «,?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» Match a single character in the range between “0” and “9” «[0-9]{3}» Exactly 3 times «{3}» Match the regular expression below «(?:\.[0-9]{2})?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» Match the character “.” literally «\.» Match a single character in the range between “0” and “9” «[0-9]{2}» Exactly 2 times «{2}» Assert position at the end of the string (or before the line break at the end of the string, if any) «$» 

Будет матч:

 1,432.01 456.56 654,246.43 324.75 

Не будет соответствовать:

 1,43,2.01 456, 654,246 324.7523 

Соответствует номерам, разделенным запятыми или десятичными знаками без разбора:

 ^(\d+(.|,))+(\d)+$ 

Визуализация регулярных выражений

Демоверсия Debuggex

Разъяснение:

  Matches Numbers Separated by , or . ^(\d+(.|,))+(\d)+$ Options: case insensitive Match the regular expression below and capture its match into backreference number 1 «(\d+(.|,))+» Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» Note: You repeated the capturing group itself. The group will capture only the last iteration. Put a capturing group around the repeated group to capture all iterations. «+» Match a single digit 0..9 «\d+» Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» Match the regular expression below and capture its match into backreference number 2 «(.|,)» Match either the regular expression below (attempting the next alternative only if this one fails) «.» Match any single character that is not a line break character «.» Or match regular expression number 2 below (the entire group fails if this one fails to match) «,» Match the character “,” literally «,» Match the regular expression below and capture its match into backreference number 3 «(\d)+» Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» Note: You repeated the capturing group itself. The group will capture only the last iteration. Put a capturing group around the repeated group to capture all iterations. «+» Match a single digit 0..9 «\d» 

Будет матч:

 1,32.543,2 5456.35,3.2,6.1 2,7 1.6 

Не будет соответствовать:

 1,.2 1234,12345.5467. ,125 ,.234 123,.1245. 

Примечание: оберните либо в группу, а затем просто потяните группу, сообщите мне, если вам нужно больше деталей.

Описание: Этот тип RegEx работает с любым языком (PHP, Python, C, C ++, C #, JavaScript, jQuery и т. Д.). Эти регулярные выражения хороши для валюты в основном.

Добавьте запятую в диапазон, который может находиться перед точкой:

 /([0-9,]+\.[0-9]+)/ # ^ Comma 

И это регулярное выражение:

 /((?:\d,?)+\d\.[0-9]*)/ 

Будет соответствовать только

 1,067120.01 121,34,120.01 

Но нет

 ,,,.01 ,,1,.01 12,,,.01 # /( # (?:\d,?) Matches a Digit followed by a optional comma # + And at least one or more of the previous # \d Followed by a digit (To prevent it from matching `1234,.123`) # \.? Followed by a (optional) dot # in case a fraction is mandatory, remove the `?` in the previous section. # [0-9]* Followed by any number of digits --> fraction? replace the `*` with a `+` # )/ 

Вы можете использовать это регулярное выражение: –

 /((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/ 

Объяснение: –

 /( (?:[0-9]+,)* # Match 1 or more repetition of digit followed by a `comma`. # Zero or more repetition of the above pattern. [0-9]+ # Match one or more digits before `.` (?: # A non-capturing group \. # A dot [0-9]+ # Digits after `.` )? # Make the fractional part optional. )/ 

С помощью sscanf может использоваться плавающий по умолчанию (% f).

 $result = sscanf($s, '%f') 

Тем не менее, это не разбивает части на массив. Он просто анализирует поплавок.

См. Также: http://php.net/manual/en/function.sprintf.php

Подход регулярного выражения:

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

Это должно работать

 preg_match('/\d{1,3}(,\d{3})*(\.\d+)?/', $s, $matches); 

Вот большое рабочее регулярное выражение. Это принимает числа с запятыми и десятичными знаками.

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