Перейти к публикации

Float с запятой?!


Рекомендованные сообщения

<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
	<name>float bug</name>
	<description></description>
	<icon></icon>
	<version>1.0</version>
	<dleversion></dleversion>
	<versioncompare>less</versioncompare>
	<upgradeurl></upgradeurl>
	<filedelete>0</filedelete>
	<needplugin></needplugin>
	<mnotice>1</mnotice>
	<mysqlinstall><![CDATA[]]></mysqlinstall>
	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
	<mysqlenable><![CDATA[]]></mysqlenable>
	<mysqldisable><![CDATA[]]></mysqldisable>
	<mysqldelete><![CDATA[]]></mysqldelete>
	<phpinstall><![CDATA[]]></phpinstall>
	<phpupgrade><![CDATA[]]></phpupgrade>
	<phpenable><![CDATA[]]></phpenable>
	<phpdisable><![CDATA[]]></phpdisable>
	<phpdelete><![CDATA[]]></phpdelete>
	<notice><![CDATA[Результат смотреть /engine/ajax/controller.php?mod=test]]></notice>
	<file name="engine/ajax/test.php">
		<operation action="create">
			<replacecode><![CDATA[<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

if(!defined('DATALIFEENGINE')) {
	header( "HTTP/1.1 403 Forbidden" );
	header ( 'Location: ../../' );
	die( "Hacking attempt!" );
}

function vardump($var) {
  echo '<pre>';
  var_dump($var);
  echo '</pre>';
}

$pi = 3.14;
vardump($pi);]]></replacecode>
		</operation>
	</file>
</dleplugin>

Почему при обращении к /engine/ajax/controller.php?mod=test я получу

float(3,14)

а если просто создать test,php в корне сайта (не подключая к DLE) получу

float(3.14)

 

То есть, у меня сервер настроен правильно, а DLE изменяет настройки локали, касающиеся точки/запятой. Общепринято использовать точку. А ведь вы предлагаете не только русскую версию, но и англоязычную. Иностранные разработчики не поймут такой юмор.

И кажется, это в последних версиях появилось, раньше такого не замечал.

 

Выявил, когда хотел в базу записать дробное значение, тип float, а записалась только целочисленная часть.

 

Костыль - в начале нужного файла указать

setlocale(LC_NUMERIC, 'C');

 

Возможно, DLE не использует дробные числа и вам нормально. Но думайте и о сторонних разработчиках, которым работать с вашим продуктом.

Ссылка на сообщение
Поделиться на других сайтах

@webair,открой /language/Russian/website.lng, там в конце есть строчка 

@setlocale(LC_ALL, array("ru_RU.UTF-8", "ru_RU.UTF8"));

В англоязычной версии её нет, так что для иностранных разработчиков таких "сюрпризов" не будет. @celsoft уже как-то объяснял, зачем они меняют настройки локали, так как не все шаредхостинги настроены нормально.

Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, germanydletest сказал:

уже как-то объяснял, зачем они меняют настройки локали, так как не все шаредхостинги настроены нормально

Спасибо! Сам бы я это долго искал...

Даже не знаю, зачем устанавливать ru_RU.UTF-8? Для вывода дат на русском? Для этого нужно ломать числа и совместимость модулей между русской и английской версией, если модуль использует не только целые числа?

Можно же было локализовать только то что нужно.

Цитата
  • LC_ALL - все нижеперечисленное
  • LC_COLLATE - функции сравнения строк, см. strcoll()
  • LC_CTYPE - функции преобразования и классификации строк, например strtoupper()
  • LC_MONETARY - для функции localeconv()
  • LC_NUMERIC - задает символ десятичного разделения (см. также localeconv())
  • LC_TIME - форматирование даты/времени функцией strftime()
  • LC_MESSAGES - для системных сообщений (доступна, если PHP был скомпилирован с поддержкой libintl)

 

UPD. Посмотрел lng файл, там есть массивы с русскоязычными названиями дат. Тогда я не понимаю смысл)

Изменено пользователем webair
Ссылка на сообщение
Поделиться на других сайтах
36 минут назад, webair сказал:

Но думайте и о сторонних разработчиках, которым работать с вашим продуктом.

С чего бы DLE беспокоиться за сторонних разработчиков? Они поддерживают движок в первую очередь для клиентов и получения с этого прибыли. То что кто-то что-то будет писать под/для DLE никак не относиться к разработчикам продукта.

Ссылка на сообщение
Поделиться на других сайтах
24 минуты назад, webair сказал:

Тогда я не понимаю смысл)

celsoft придёт и в очередной раз (возможно), объяснит смысл)))

Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, germanydletest сказал:

celsoft придёт и в очередной раз (возможно), объяснит смысл)))

@celsoft, сбрасывать локали для английского языка не надо, а для русского надо? Иностранные сервера настроены всегда правильно? Что плохого бы случилось, если сбрасывали так?

setlocale(LC_ALL, "C");

 

Ссылка на сообщение
Поделиться на других сайтах

в presta вместо LC_ALL используют (необходимые для них) LC_COLLATE, LC_CTYPE, LC_TIME, LC_NUMERIC по причине этого:

http://www.php.net/manual/fr/function.setlocale.php#25041

Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, webair сказал:

Даже не знаю, зачем устанавливать ru_RU.UTF-8? Для вывода дат на русском?

Нет. Для корректной работы с русским языком, по всем аспектам это и файловая система и ЧПУ и тексты и много много где. Некорректная локаль приводит к потере символов в строках. Прочитайте разные темы на форуме где пользователи не понимают почему вдруг из текста пропадает какая либо буква. Это из за локалей происходит. Локаль ставится согласно используемому языку в DLE.

 

6 часов назад, webair сказал:

Общепринято использовать точку.

Кем принято? В русском языке принята именно запятая а не точка и арифметические операции производятся также корректно. В других языках принята точка. Это зависит от языка, поэтому устанавливается также в языковых файлах.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, celsoft сказал:

 

 

Кем принято? В русском языке принята именно запятая а не точка и арифметические операции производятся также корректно. В других языках принята точка. Это зависит от языка, поэтому устанавливается также в языковых файлах.

Попробуйте с запятой число вставить в mysql. Выдаст ошибку или вставится только целочисленная часть. Все mysql сервера по умолчанию в float используют точку, вы это знаете.

Ладно, для себя я решил проблему, вырезав эту строку)

Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, webair сказал:

Ладно, для себя я решил проблему, вырезав эту строку)

Классное решение, а что вы будете делать если эта настройка будет прописана в настройках сервера? Ведь любую локаль можно прописать именно в настройках сервера.

 

Может нужно писать более правильный и независимый код, и проводить корректные преобразования данных специально предусмотренными для этого средствами? Не думали об этом? Какими именно? Пожалуйста https://www.php.net/manual/ru/function.number-format.php

Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, celsoft сказал:

Классное решение, а что вы будете делать если эта настройка будет прописана в настройках сервера? Ведь любую локаль можно прописать именно в настройках сервера.

 

Может нужно писать более правильный и независимый код, и проводить корректные преобразования данных специально предусмотренными для этого средствами? Не думали об этом? Какими именно? Пожалуйста https://www.php.net/manual/ru/function.number-format.php

У меня сервер изначально корректно настроен на setlocale(LC_ALL, "C"), проблем с путями и названиями файлов нет.

Главное, выяснили, что это не баг, а фича оказывается. Которая мне (моему клиенту) не нужна :)

Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, webair сказал:

У меня сервер изначально корректно настроен на setlocale(LC_ALL, "C"), проблем с путями и названиями файлов нет.

Корректно, это когда локаль полностью соответствует языку сайта. У вас он на русском, т.к. русский языковый пакет. Поэтому при корректной настройке была бы запятая   Так что "корректно" понятие растяжимое, правильнее написать как меня устраивает. Это во первых.

 

 

Во вторых вы не знаете где они возникают, поэтому не можете утверждать что у вас нет проблем. Проблемы далеко не всегда видимы и далеко не со всеми именами проявляются.

 

Я не собираюсь вас ни в чем переубеждать, но возникающие вопросы нужно решать корректно, а не через "костыли", а корректным является написание кода, которое не зависит ни от чего, ни от локалей самого сервера, ни от того что прописано в DLE. И как это сделать я написал выше. А пользоваться советом или нет ваше право.

 

Я бы тоже удовольствием отказался бы от локалей в DLE, но там к сожалению не получится, т.к. работа завязана на стандартные функции PHP, а они в свою очередь на локали и это другим способом не обойти.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...