Как будет воспринято программой число в котором разделителем дробной части вместо запятой

Что делать, если программа умножает все числа на 1000

Дело тут не в ошибках программы, а в настройках Windows. Как вы, наверное, знаете, в разных странах принято по-разному писать числа с дробной частью. Например, в Советском Союзе было принято при записи числа отделять целую часть от дробной запятой, например: «1,23», тогда как в американской системе для этих же целей служит точка: «1.23». В настройках операционной системы Windows вы можете указать, какой символ вы хотите использовать в качестве разделителя; программа Тирика-Магазин умеет работать и в том случае, если в качестве разделителя целой и дробной части используется запятая, и в случае, если используется точка.

В Windows есть еще одна настройка: разделитель групп разрядов. Человеку сложно прочитать число с большим количеством знаков, например, «1234765785678», и для того, чтобы сделать такую запись более читаемой, его часто записывают так: «1 234 765 785 678» либо так: «1,234,765,785,678» разделяя группы разрядов (единицы, тысячи, миллионы) каким-либо символом, например, пробелом или запятой. Программа Тирика-магазин понимает такую запись числа и может правильно прочитать это число в любом из трех приведенных вариантов записи.

Как заменить точку на запятую в Excel | Функция найти и заменить

Ниже мы расскажем, как перенастроить Windows для того, чтобы программа не путала эти разделители.

Настройка Windows 7

Нажмите кнопка Пуск, далее Панель Управления (см. снимок окна ниже):

image001

В панели управления зайдите по ссылке в секцию «Часы, язык и регион» и вы попадёте в следующее окно:

image002

В этом окне выберите ссылку «Изменение форматов даты, времени и чисел» и вы попадёте в окно «Язык и региональные стандарты»:

image003

Далее в этом окне нажать кнопку «Дополнительные Параметры» и вы попадёте в окно, где нужно внести правильные настройки:

image004

В открывшемся окне на закладке числа проверить, что стоит в опциях «разделитель целой и дробной части» и «разделитель групп разрядов». Если в одной из этих опций стоит запятая, а в другой точка, или наоборот, или и там и там стоит точка либо запятая, необходимо изменить параметры следующим образом:

После внесения изменений в настройки нужно нажать кнопку ОК для сохранения изменений. Для того, чтобы новые параметры вступили в силу, перезапустите программу Тирика-магазин.

Настройки для Windows 8

В Windows 8 нет привычной нам по предыдущим версиям кнопки Пуск, поэтому в Панель Управления Windows нужно попасть другим способом:

Замена точек запятыми (системно)

После внесения изменений в настройки нужно нажать кнопку ОК для сохранения изменений. Для того, чтобы новые параметры вступили в силу, перезапустите программу Тирика-магазин.

Настройки для Windows XP

Зайдите, пожалуйста, в меню Пуск, далее выберите Панель Управления, и в панели управления выберите раздел «Дата, время, язык и региональные стандарты»:

image005

В открывшемся окне выберите «Изменение формата отображения чисел, даты и времени»:

image006

После этого вы попадёте в окно «Язык и региональные стандарты». В этом окне на закладке «Региональные параметры» нажмите кнопку «Настройка»:

Читайте также:
Почему не приняли программу 500 дней

image007

После внесения изменений в настройки нужно нажать кнопку ОК для сохранения изменений. Для того, чтобы новые параметры вступили в силу, перезапустите программу Тирика-Магазин.

Как в Windows 10 заменить запятую на точку при наборе с numpad на русской раскладке?

5c5b21807718e740316199

Может расскажаете свое видение решения? А мы уже в эту сторону подумаем
Или вам лень мешает пару кнопок нажать и клаву создать?

Yan, вопрос был как заставить работать нынешнюю раскладку, а не как создать новую.

Может расскажаете свое видение решения? А мы уже в эту сторону подумаем

5c5b21807718e740316199

ColdSpirit, Проверил, та же проблема
Думаю тут реестр не поможет редактировать, скорее какой-то dll

Легче уже раскладку заменить на свою
Сам пользуюсь из-за точки
установочного файла к сожалению нету, а то бы приложил
А так, насколько помню в пару кликов настроил, сохранил
эту поставил, другую убрал. Работает отлично (благо софт от мелкомягких)

5b7975d683486792428577

«точка» это не точка а «десятичный разделитель» и что будет введено задаётся именно локалью ака региональными настройками.
Есть некоторое количество софта который игнорирует региональные настройки и применяет свои и тут уже разбираться необходимо с софтом.

Изменение запятой на точку в региональных стандартах не помогает.

Что значит не помагает?
Ставим «точку» в блокноте, меняем в доп. настройках «запятэ» на точку, ставим в блокноте нумпадовскую точку.
Если разное то окей, если не меняется то тогда уже и думать что такое случилось с функцией рег. настроек в вашей системе и только в вашей.

Источник: windorez.ru

Точка, точка… запятая?

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

Вот, например, у меня на компьютере сегодняшняя дата пишется так — 06.01.2023, а на одном из моих серверов в уголке экрана светится 01/06/23. Это американский формат, и я каждый раз мучительно вспоминаю, 01/06 это первое июня или всё таки шестое января.

Ещё одно национальное отличие — символ отделения целой и дробной части в числах. В России по традиции и в соответствии со стандартами надо отделять дробную часть запятой (Пи = 3,14), а американцы (и вслед за ними программисты) используют десятичную точку (Pi = 3.14). Из-за этого различия иногда случаются разные казусы.

В русском Excel в разделе «Сохранить как» есть формат файла «CSV (разделитель — запятая)». Если вы сохраните таблицу в этом формате, то получите текстовый файл, в котором разделителем колонок будет… Нет, не запятая, как было обещано, а точка с запятой, поскольку запятая уже занята как разделитель дробной части.

Если же вы попробуете открыть «американский» CSV-файл (с разделителем запятой и десятичной точкой), скачанный из интернета, то у вас возникнет сразу несколько проблем. Во-первых, все столбцы сольются в один, поскольку не будет распознан разделитель столбцов. Это можно преодолеть, предварительно вставив в начало файла магическую строку sep=, , но тут вы нарветесь на вторую проблему — теперь ваши числа с десятичными точками будут восприняты не как числа, а как текст. В принципе, можно выделить колонки с числами и сделать во всех ячейках замену точки на запятую, но у себя я наткнулся на третью проблему — при открытии файла Excel попытался угадать формат ячеек и безвозвратно заменил небольшие числа вида «1.2» на даты — «1 февраля 2023».

Читайте также:
Что значит участник программы субсидирования

Для того, чтобы упростить работу с национальными форматами, программисты разработали специальные базы данных, автоматизирующие процесс локализации программ (по-английскии кратко пишется L10N поскольку L[ocalizatio]N). На программистском жаргоне эти базы называются локалями и обозначаются либо названием языка («Русский»), либо аббревиатурой, составленной из названия языка и названия страны (en_US — американский английский). В Windows можно выбрать стандартную локаль (ищем в настройках Windows 10 слово «Регион») и (при желании) поправить отдельные ее параметры («Панель управленияЧасы и регион»). В командной строке Linux локаль в целом выбирается установкой значения переменной LANG или LC_ALL, а частичные изменения настраиваются через переменные LC_NUMERIC, LC_TIME и т.д. У меня, например, в Windows отдельно настроена десятичная точка, а в Linux установлен программистский языковой стандарт для чисел LC_NUMERIC=C . В Excel в дополнительных параметрах присутствует отдельный пункт для разделителя целой и дробной частей числа — можно выбирать между разделителем из системной локали и произвольным символом, например, точкой.

А теперь примеры программистских ошибок.

В 2000-х годах в суперкомпьютерном центра МГУ эксплуатировался NUMA сервер от IBM. Сейчас не могу вспомнить, какой именно модели, поскольку в последний раз получал к нему доступ десять лет назад в 2013 году. На сервере использовался родной компилятор от IBM и этот компилятор имел замечательную ошибку.

При установленной русской локали ru_RU он не мог распознать вещественные числа в программах, поскольку считал, что разделителем десятичных знаков должна быть запятая. Программы не собирались, а компилятор выдавал сообщение о недопустимом символе в позициях, в которых стояли десятичные точки. Когда моя коллега впервые наткнулась на эту ошибку у меня ушло минут 40 для того, чтобы осознать, что дело не в кодировке и не в невидимых символах в окрестности десятичных точек, а именно в локали. Ради интереса, я поменял все десятичные точки на запятые, но это не помогло: в зависимости от контекста, эти запятые интерпретировались либо как разделители параметров функции, либо как оператор «запятая», что, в общем-то, было вполне ожидаемо.

Недавно наткнулся в собственной программе на то, что при установленной русской локали вывод вещественных чисел в C++ двумя разными способами дает разные результаты:

#include #include #include #include int main(int argc, char *argv[])< float pi=3.14; // Укажем, что мы хотим форматировать числа, даты, валюты и пр. // по правилам русского языка setlocale(LC_ALL, «Russian»); // libc по умолчанию использует пользовательские настройки printf(«%fn», pi); // 3,14 // Стандартные потоки по умолчанию используют локаль POSIX std::cout блоге у Евгения Степанищева на ещё один интересный пример, на этот раз из ранних версий PHP4, и решил, что пора писать обобщающий материал. Хотя бы для того, чтобы обратить на эту проблему внимание начинающих программистов.

Пример от Евгения (можно поиграться в песочнице). Установка локали в PHP 4.2.3 влияет на конвертацию строки в число:

Источник: habr.com

Как будет воспринято программой число в котором разделителем дробной части вместо запятой

Разделитель дробной части по-умолчанию

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Сообщений: 10 • Страница 1 из 1

Разделитель дробной части по-умолчанию

Мне для моей программы удобно выставить в качестве разделителя точку вместо запятой, которая используется для русской локали по-умолчанию. Для этого я просто при инициализации программы прописывал Код: Выделить всё DefaultFormatSettings.DecimalSeparator:=’.’;
Но как оказалось, если при работающей программе Windows уйдет в режим ожидания(смены пользователя) и вернется, то разделитель опять становится запятой и программа начинает работать некорректно.
Кто нибудь может подсказать либо как выставить разделитель так чтоб он не менялся во время работы всей программы, либо какое событие отлавливать чтобы вручную возвращать на точку?

Читайте также:
Установить программу playmemories home

Re: Разделитель дробной части по-умолчанию

Делать
Код: Выделить всё DefaultFormatSettings.DecimalSeparator:=’.’;
Каждый раз перед преобразованием строк

  • Профиль
  • Сайт

Re: Разделитель дробной части по-умолчанию

gluhow , а вы где инициализируете? У меня вставлено в секции инициализации всех модулей, где это требуется, и всё работает.

  • Профиль
  • Сайт

Re: Разделитель дробной части по-умолчанию

zub писал(а): Каждый раз перед преобразованием строк

Да, вот сейчас изыскиваю по старому проекту все преобразования. Но без DefaultFormatSettings элементы на форме типа TFloatSpinEdit тоже начинают показывать через запятую.

Снег Север писал(а): gluhow , а вы где инициализируете? У меня вставлено в секции инициализации всех модулей, где это требуется, и всё работает.

У меня прописано один раз в инициализации главного модуля. Всё работает, но до момента ждущего режима.

Re: Разделитель дробной части по-умолчанию

Чудес не бывает. Либо Вы сами, либо включенный сторонний код меняет сепаратор в какомто событии происходящем при входевыходе в спячку.
Поэтому просто это вот так:
Код: Выделить всё myseparator: char;
begin
myseparator := DecimalSeparator;
DecimalSeparator := ‘.’;
Result := FloatToStr( d );
DecimalSeparator := myseparator;
end;
А правильно это не юзать DefaultFormatSettings.DecimalSeparator используя функции в которые передается ваш FormatSettings

Добавлено спустя 1 минуту 45 секунд:
>>Но без DefaultFormatSettings элементы на форме типа TFloatSpinEdit
Я нуб, у TFloatSpinEdit разве нет своего управления разделителями?

  • Профиль
  • Сайт

Re: Разделитель дробной части по-умолчанию

По моему цифры «распознаются» с точкой по умолчанию, а DecimalSeparator как-бы «доброе пожелание» .
(Но возможно я что-то путаю так как обычно использую легаси процедуру Val удобную тем, что при ошибке не порождает исключения, а дает номер позиции в строке где обнаружена ошибка . )
.
( VAL (ST, X, CODE), где ST – строка, которую необходимо преобразовать в число, X – вещественная или символьная переменная, в которую записывается это число, CODE – необязательный параметр, который, в случае ошибки будет содержать номер позиции, в которой обнаружен ошибочный символ или ноль если все в порядке )

Re: Разделитель дробной части по-умолчанию

zub писал(а): у TFloatSpinEdit разве нет своего управления разделителями?

нет, нету. Он чудесно реагирует на смену стандартного.

Похоже, что меняется где-то в недрах lcl, т.к. в консоли все норм. Минимальный код для графического приложения:
Код: Выделить всё unit Unit1;

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
DefaultFormatSettings.DecimalSeparator:=’.’;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Memo1.Lines.Insert(0, FloatToStr(3.14));
end;

Re: Разделитель дробной части по-умолчанию

>>Минимальный код для графического приложения:
У меня в транковом лазаре все работает нормально. Вполне возможно у вас установлен какойнить кривой компонент который все портит
я бы копал:
1.поиск DefaultFormatSettings в исходниках всех установленных компонентов
2.проверка примера на лазаре из коробки, с последующей доустановкой в лазарь стороннего добра
3.установка на DefaultFormatSettings.DecimalSeparator точки останова на изменение данных

1 и 2 — по сути одно и тоже, 3 — когда мне подобное было надо не работал, работает ли сейчас хз

  • Профиль
  • Сайт

Re: Разделитель дробной части по-умолчанию

Для того, чтобы не изменялись переменные с разделителями надо в коде старта программы после Initialize добавить Application.UpdateFormatSettings:=false;

т.е.:
Код: Выделить всё Application.Initialize;
Application.UpdateFormatSettings:=false;

  • Профиль
  • Сайт
  • ICQ

Источник: www.freepascal.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru