Помощь новичкам

Нет. Настройка этого - в вашей Windows - .NET просто берёт информацию оттуда. Если Вы исправите это в Windows, то и в .Net всё будет с точкой

Это как бы ожидаемо. Но я имел в виду иное. В MS Office региональные настройки можно брать из Windows, а можно установить свои, только в пределах офиса. Т.е. если я работаю с разделителем-точкой, а мне нужно написать программу для Excel и там хотят, чтобы была запятая, то я делаю временные настройки в офисе - и все, спокойно там отлаживаюсь. А в паскале, к примеру, точка остается точкой.

Мы потратили достаточно много времени чтобы в наших стандартных функциях точка оставалась точкой.

Но если граждане пользуются голыми методами .NET, то в русских Windows там будет запятая. И им будут советовать установить английскую культуру, что вообщем быстро и неправильно.

Там в en_US возникает проблема с запятой после тысяч. Где-то пишут, надо ставить некую “нейтральную культуру” и там уже править. Но я не понял, как это делать и есть ещё дополнительная проблема с разделителем тысяч - не совсем понятно, как туда поставить пустое место, так как пустое место не буква, а строка.

запятые не нужны.

1 лайк

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

У меня не возникает:

begin
  var r := 123456.789;
  r.ToString(new System.Globalization.CultureInfo('en-US')).Print;//выводит "123456.789"
end.

И кроме того, нечего там разбираться. Если я правильно понял - вы говорите про форматирование текста для большей читабельности. К примеру:

begin
  var r := 123456789;
  var nf := (new System.Globalization.CultureInfo('en-US')).NumberFormat;
  
  nf.NumberGroupSeparator := '-';//По умолчанию ','
  r.ToString('N', nf).Println;//123-456-789.00
  
  nf.NumberGroupSizes := new integer[0];
  r.ToString('N', nf).Println;//123456789.00
end.

Первый вариант легче читать человеку. Но и компьютер может его прочитать:

begin
  var s := '123-456-789.10';
  var nf := (new System.Globalization.CultureInfo('en-US')).NumberFormat;
  nf.NumberGroupSeparator := '-';
  
  var r := System.Convert.ToDouble(s,nf);
  writeln(r);//123456789.1
end.

Вот такое мнение бывает когда на левых ресурсах читаешь. На msdn чёрным по белому написано что для этого надо всего лишь вместо 'en-US' передать пустую строку.

То есть способ обнулить NumberGroupSize очевиден и не ‘костыль’?

Не совсем - я говорю о том, что en-US это целый набор установок, в том числе и с запятой, как разделитель тысяч, которая не особо понятно когда включается и выключается.

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

“Нельзя преобразовать тип array of real к array of integer” Почему так нельзя:

begin
  var n := 10;
  var a := ArrFill(n, 2);
  a := a.Select((el, ind)-> Power(el, ind)).ToArray; // тут ошибка
  a.Println;
end.

а так можно:

begin
  var n := 10;
  var a := ArrFill(n, 2);
  var b := a.Select((el, ind)-> Power(el, ind)).ToArray;
  b.Println;
end.

После возведения в степень получается массив вещественных. Он несовместим с массивом целых

Меня сбил с толку intellisense вот только что он показывал, что массив b это массив of integer, а сейчас уже показывает, что of real. Жаль что не заскринил… Погодите а вот у меня есть еще другой похожий код там видно %D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

Intellisence - он на самом деле не такой уж и intelli. Бывает, что пока не откомпилируешь программу, он не понимает, с каким типом данных имеет дело. А уж если программа содержит ошибки, не дающие ее откомпилировать, вероятность “странностей” увеличивается в разы.

Хорошо работает Intellisence, если программа сразу набирается безошибочно. А если что-то переопределить, может и соврать. Пока вот так.

здесь точно показывает массив целых, хотя должен бы риал, или нет?

begin
  var n := 10;
  var a := Range(1, n).Select(el -> Power(2, el)).ToArray;
  a.Println;
end.

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA1

Вы прочитали мой предыдущий пост? Откомпилировали?

Конечно, тут тип real[10]. Врёт. Не может он понять, что получится после проекции с лямбдой, вызывающей функцию.

Ну конечно, программа запускается и выдает результат, но почему пишет, что массив целых, если после Power должен получиться массив вещественных?

Наверно все же потому, что это Intellisence - это небольшая вспомогательная программа, а не полноценный компилятор. Если Вам нужна точная информация о типе, ставьте отладочную точку прерывания и после запуска программы смотрите его в локальных переменных.

О, благодарствую, полезная информация. Но наверное этот случай нужно закинуть в ошибки?

А это уж Вам решать…

Это в issue может быть вопрос - кидать или нет. А в ошибки на форуме можно и желательно кидать всё что странно работает. Там уже решат - ошибка или нет, и если это новая ошибка - кинут в issue.

Здравствуйте, изучая программирование, наткнулся на головоломку по питону 1
Решил тоже самое провернуть в PascalABC (версия 3.4, сборка 1672 от 10.06.2018).

1 Пример
2

2 Пример
3

Почему в 1 примере произошла ошибка, а во 2 все отработало? Ведь поменять поля кортежа после его создания невозможно.