В таблице может быть только один первичный ключ. Факт, в котором может состоять более чем из одного поля, не увеличивает количество первичных ключей, есть еще один.
Поскольку часть пары PK не уникальна, вам, очевидно, нужно создать внешний ключ, который ссылается к двум полям: ССЫЛКИ t1 (f1, f2).
Использование str_replace ()
для удаления точек не является избыточным.
$ string_number = '1.512.523,55'; // ПРИМЕЧАНИЕ. Вы действительно не должны использовать floatval () здесь, это просто, чтобы доказать, что это законное значение float. $ number = floatval (str_replace (',', '.', str_replace ('.', '', $ string_number))); // В этот момент $ number является «естественным» поплавком. print $ number;
Это почти наверняка наименее насыщенный CPU способ, которым вы можете это сделать, и вероятность того, что даже если вы используете какую-нибудь причудливую функцию для этого, что это то, что он делает под капотом .
Может показаться чрезмерным, но будет преобразовывать любой заданный формат без mater locale:
function normalizeDecimal ($ val, int $ precision = 4): string {$ input = str_replace ('', '', $ val); $ number = str_replace (',', '.', $ input); if (strpos ($ number, '.')) {$ groups = explode ('.', str_replace (',', '.', $ number)); $ lastGroup = array_pop ($ groups); $ number = implode ('', $ groups). '' , $ LastGroup; } return bcadd ($ number, 0, $ precision); }
Выход:
.12 - & gt; 0.1200 123 - & gt; 123,0000 123,91 - & gt; 12345678,9100 123 456 78,91 - & gt; 12345678,9100 123,456,78.91 - & gt; 12345678.9100 123.456.78,91 - & gt; 12345678,9100 123 456 78,91 - & gt; 12345678.9100
Если вы используете PHP5.3 или выше, вы можете использовать numfmt_parse , чтобы выполнить «обратный номер_формат». Если вы этого не сделали, вы застряли с заменой записей с помощью preg_replace / str_replace.
intl
. Он не встроен, он должен быть явно скомпилирован или установлен как отдельный расширение. Не все хостинг-провайдеры устанавливают его с помощью PHP.
– cronfy
12 April 2016 в 09:02
Вы можете использовать класс NumberFormatter с помощью метода parse .
Предполагая, что они находятся в файле или массиве, просто замените его как пакет (то есть на всех сразу):
$ input = str_replace (array ('.', ',' ), array ('', '.'), $ input);
, а затем обрабатывать числа оттуда, полностью используя непринужденную типизацию PHP.
Эта функция совместима для чисел с точками или запятыми как десятичные числа
function floatvalue ($ val) {$ val = str_replace (",", ".", $ val); $ val = preg_replace ('/\.(?=.*\.)/', '', $ val); return floatval ($ val); } $ number = "1.325.125,54"; echo floatvalue ($ number); // Выход 1325125.54 $ number = "1,325,125.54"; echo floatvalue ($ number); // Выход 1325125.54
из руководства PHP:
str_replace - заменить все вхождения строки поиска на заменяющую строку
blockquote>. Я бы спустил этот маршрут, а затем конвертировать из строки в float - floatval
floatval
был ключевым здесь ... thx – Matt Bannert 6 October 2015 в 17:06$ number = str_replace ([',', '.'], ['.'], $ string_number) * 1.0;
– Jeff 25 October 2017 в 17:56