2017-04-14 13 views
1

如果存在小數點分隔符(點(。)或逗號(,)和千位分隔符(逗號(,)或點(。))傳入的值應該由圖案處理 我當前的代碼是想要根據當前情況給定輸入的preg_match()模式... PHP

if (!preg_match('/^((?:(?:\-?[\d' . $thousandSeparator . ']+(?:' . $decimalSeparator . '\d+)?)|\s*))\s*(.*)$/', $value, $matches)) 
{ 
    throw_error; 
} 

CASE 1 - $ decimalSeparator = ' '; $ thousandSeparator =',';

允許案例 -

  • 45,789.45
  • 45,789.45釐米
  • 789釐米
  • 789.45釐米
  • 1789釐米
  • 78,789,756.45

不允許案例 -

  • 45.789,78
  • 45.789,78釐米
  • 78.7.78,78
  • 7.8,5
  • 7.8釐米

案例2 - $ decimalSeparator = ''; $ thousandSeparator ='。';

允許的情況下 -

  • 45.789,78
  • 45.789,78釐米
  • 789,45
  • 1.789釐米

不允許的情況下 -

  • 45,789.45
  • 45,789.45釐米
  • 789釐米
  • 789.45釐米
  • 1789釐米
  • 78,789,756.45
  • 78,78,78釐米

注 - '釐米' 是釐米這是可變的,可以有英寸,毫米,公里等單位可以存在與否,但如果它在那裏,它需要處理。現在我已經隨機放置了這個單元,請不要考慮單元,因爲它是確切的方式。

謝謝。:)

+1

目前尚不清楚,我爲什麼'789.45 cm'應同時'7.8 cm'不是(對於第一種情況)被允許。 – Jan

+0

https://regex101.com/r/Wc9Lf9/1 – Deadooshka

回答

3

你可以建立自己的模式是這樣的:

$units = ['[mck]m', 'inch']; // complete it 
$pattern = sprintf('~^-?\d{1,3}(?:[%s]\d{3})*(?:[%s]\d\d)?(?: (?:%s))?$~', $thousandSep, $decimalSep, implode('|', $units)); 
+0

我喜歡你的模式。良好的工作:) 你能告訴我什麼是模式,如果我們從輸入中刪除單位部分,? (?:[%s] \ d {3})*(?:[%s] \ d +)?(?:( ?:%s))?$〜',因爲我想在十進制數後允許多個數字。 –

+0

@KshitijYelpale:如果你不想要單元部分,你需要刪除'(?:(?:%s))?'和'sprintf'的最後一個參數。 –