ух ты, не знал, что так тоже можно (массивы так передавать). Сразу не понял, думал что это оператор, весь гугл поломал. вот по этому стараюсь на русском все прописывать, чтоб не путаться )
В смысле? Там ведь просто берётся первый и второй элемент массива, считываются и передаются как параметры для метода. Что именно из этого вы не знали, и чем тут помогли бы русские названия.
Есть такой код:
begin
var s := '1234.56789'; //так не работает
// var s := '1234,56789'; //а так работает
var numr: real;
if Real.TryParse(s, numr) then write('1')
else write('0');
end.
Как бы тут правильно прописать культуру, чтоб видело точку, а не запятую?
Просто сразу не разобрался. Думал это какой-то хитрый оператор (просто в ассемблере такой есть, вот я и зациклился, подвис). Русский помогает с ходу видеть где оператор, а где функция или метод, жаль в паскале нед подсветки, так бы понятней было в программе разбираться. Но это так, из области хотелок.
Прочитайте внимательно, то не та подсветка.
ну да, методы и функции оно не подсвечивает, и классы тоже, хотя можно высветить begin-end в отдельный цвет =) А по моему вопросу может чего посоветуете, чуть выше?
Когда вы открываете скобочку - появляется такое окошко:
Видете, там слева написано “1 из 2”? Это значит что у real.TryParse
есть 2 (второе число) перегрузки, и вы сейчас смотрите на №1 (первое число). Если вы нажмёте на те стрелочки, или у себя на клавиатуре на стрелку вниз или вверх - вам покажет другую перегрузку:
У русских целую и дробную часть числа разделяет запятая, а у европейцев и американцев - точка. То есть это региональные различия которые надо указать (а иначе берёт те что по умолчанию. У вас система на русском, поэтому и выбирает запятую).
Чтоб узнать что в параметр style
пихать - ищем его тип (NumberStyles
) на msdn (эта ссылка сразу на поиск с введённым запросом). Переходим по первому ответу. Тут видим следующее:
-
“NumberStyles Enumeration”.
Enumeration
(enum) - это перечислимое. Тип который получается, к примеру, так:type тип_животного=(человек, лев, кот, собака)
. Переменным этого типа можно присвоить любой 1 из его параметров:var тип_моего_животного: тип_животного := тип_животного.кот
. -
“This enumeration has a FlagsAttribute attribute that allows a bitwise combination of its member values”. “Этот энум имеет особый атирибут (FlagsAttribute), позволяющий побитово комбинировать его элементы”. Подробнее:
Справка>>Справочник по языку>>Выражения и операции>>Побитовые операции
. -
“Namespace: System.Globalization”. “Пространство имён: System.Globalization”. То есть этот тип находится в
System.Globalization.NumberStyles
, а значит каждый элемент можно получить какSystem.Globalization.NumberStyles.*Имя_элемента*
, или прописать в начале программыuses System.Globalization
(все пространства имён можно подключить черезuses
) и тогда уже писатьNumberStyles.*Имя_элемента*
(хотя целиком тоже позволит). -
Секция “Members” - тут видно в красивой таблице все элементы этого
enum
-а. Хотя вы их можете увидеть и в паскале, поставив точку послеNumberStyles
;
Теперь так же с параметром provider
. Ищем его тип на msdn и открываем первый ответ.
IFormatProvider Interface
. Интерфейс, это тип которому надо сделать (или взять готовую) реализацию, которая переопределяет работу всех методов (в данном случае он только 1 - GetFormat
);
В разделе Remarks
(заметка) написанно:
The .NET Framework includes the following three predefined IFormatProvider implementations to provide culture-specific information that is used in formatting or parsing numeric and date and time values
;
В .Net есть следующие 3 готовых реализации IFormatProvider
И дальше написанные эти 3 реализации со ссылками на них.
NumberFormatInfo
(топорный перевод: число, формат, информация) - по названию, явно то что нам надо. Переходим по ссылке к нему.
В разделе Remarks
(заметка) есть список, из способов как можно получить переменную с этим типом. Там много всего интересного. Мне удобно new CultureInfo('en-US')
, хотя есть способы и попроще.
В итоге, получаем что то типо такого (это только пример, ваш результат будет отличатся в зависимости от того что вам надо):
uses System.Globalization;
begin
var s := '1234.56789';
var numr: real;
writeln(
Real.TryParse(
s,
{
NumberStyles.AllowDecimalPoint or//разрешает дробную часть числа
NumberStyles.AllowLeadingSign or//разрешает поставить + или - перед числом
NumberStyles.AllowExponent,//разрешает писать 1.2345e+3, к примеру. e+3 значит *10^3
{}
NumberStyles.Float,//это комбинация всех предыдущих и +ещё разрешает добавить пробелы до и после числа
new CultureInfo('en-US'),
numr
)// ? 1 : 0// "b ? 1 : 0" значит "if b then 1 else 0". Раскомментируйте, если вам 1/0 нравится больше чем True/False
);
writeln(numr);
end.
И если без всех комментариев:
uses System.Globalization;
begin
var s := '1234.56789';
var numr: real;
Real.TryParse(s, NumberStyles.Float, new CultureInfo('en-US'), numr).Println;
writeln(numr);
end.
Кстати, у real.TryParse
тоже есть своя страница на msdn
(потому что msdn
это официальная справка по .Net, там по странице для всего. А иногда по несколько). Там написано Double.TryParse
, потому что Double
это .Net имя real
. На этой странице есть примеры на C#, которые легко переводятся на этот паскаль.
Хотел бы ещё добавить, что длинно получилось только потому что я старался всё подробно объяснять. На практике, поиск всего что вам понадобится займёт меньше времени чем чтение этого ответа (по крайней мере после некоторого опыта, в 2-5 таких поисков).
Огромное вам гран мерси за столь подробный ответ. Нет, правда, очень и очень. Снимаю капелюха. =)
begin
var s := '123.456';
var r: real;
if Trystrtofloat(s,r) then
Print(r);
end.
Там культура уже зашита с точкой.
Использовать английскую культуру ради точки - это русофобия
А по моему, русофобия - это разрешать только точку как разделитель. Если указывать культуру при вызове функции - можно сделать настройку, которую пользователь готовой программы сможет переключить (или, возможно, которая переключится сама, в зависимости от того как пользователь вводил раньше).
Во всех языках программирования разделитель целой и дробной части - это точка. Традиция такая, не нами придуманная.
Ну так правильно, языках программирования, а не программах которые на них написаны.
Ну да, кто же спорит. Просто английская культура включает ещё кучу всего кроме точки. Посмотрите, как это сделано в модуле PABCSystem - там это сделано аккуратнее - только разделитель и затронут.
Я тоже считал, что при делении на 0 должно быть исключение. Пока не понял, что мир изменился бесповоротно со времён Вирта
Я не понял, Вы будете делать в настройках IDE, как в MS Office - локализацию?
При чём тут это? Мне кажется, если сделать запятую вместо точки - это сломает синтаксис в следующем случае:
writeln(3,1 , 2)
Так что за это не бойтесь))). Речь шла только о функционале программ, написанных на паскале, но никак не про компилятор.
Ну так прокатывайте строки через замену точек запятыми и наоборот.
Это костыль.
Ну тогда, как было сказано, “ищите и обрящете, толцыте и отверзнется вам”. А я не хочу изображать кота, которые от безделья сами знаете, чем занимается.