- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
function Okruglenije(cislo: Currency; skolkonulei: Integer): string;
var
outs: string;
rst, cel, zn: string;
p: integer;
begin
outs := FloatToStr(cislo);
p := Pos(',', outs) + 1;
zn := Copy(outs, p, skolkonulei);
cel := FloatToStr(trunc(cislo));
if p > 1 then
rst := Trim(cel + ',' + zn)
else
rst := Trim(cel);
Okruglenije := rst;
end;
var a: single,b: string;
begin
b:=Okruglenije(a,2);
end;
-------------------------------------
b = 102,32 (string)
Delphi Style
Oppa Delphi Style
Delphi Style
Oppa Delphi Style
"Сислоу" - отличное название для компании.
var
outs: string;
rst, cel, zn: string;
l,p: integer;
begin
outs := FloatToStr(cislo);
p := Pos(',', outs) + 1;
zn := Copy(outs, p, skolkonulei);
cel := FloatToStr(trunc(cislo));
if p > 1 then
rst := Trim(cel + ',' + zn)
else
rst := Trim(cel);
if Copy(rst,Length(rst),1)=',' then rst:=StringReplace(rst,',','',[rfReplaceAll, rfIgnoreCase]);
Okruglenije := rst;
end;
охуж эти долбо... студенты
В делфи, кстати, если мне не изменяет память, было что-то типа RoundTo, котрое округляет до нужного знака. Ну и аналог printf'а вроде был, на случай если нужна сразу строка с нужным количеством знаков...
да, задача усложняется
А кто у нас главный дельфин, который должен это знать? :)
Ага, по принципу "слышал звон"... Зачем вообще лезть в число строковыми функциями - ума не приложу, и еще это :
У нас вот в школоло, конкретно в кабинете информатики, много лет висела таблица с операторами Бейсика - не Q, а именно VB: ни препод, ни школьники(в том числе и Ваш покорный слуга) не имели ни малейшего понятия, что есьм Бейсик, и зачем эта таблица вообще нужна. Зато уже много лет после выпуска я пришел к другу в школку, случайно узнал таблицу, и сразу отвернулся - Бейсик был уже в прошлом.
Здесь же другая ситуация: Currency — это не BCD, а двоичное число, которое при интерпретации делится на 10000. Т. е. при преобразовании в строку умножения/деления будут, но пока мы не выходим за рамки диапазона преобразования будут точными.
Главное при промежуточных вычислениях не использовать обычные целочисленные и вещественные типы, потому что в них большие значения могут не влезть (в Int64 и в мантиссе Extended столько же бит, сколько в Currency, но там из-за умножения/деления на 10000 может быть потеря последних знаков).
(
Ну а для округления до десятков, сотен и т.п. - по методу inkanus-gray (Math.Round(x / d_skolkoNulej) * d_skolkoNulej). Math.Round не хочет отрицательную точность принимать ;(
P.S. decimal, а не double, чтобы соответствовало коду ОП'а.
Ну а если уж пишем - то только ради того, чтобы она понимала отрицательный precision. -2 - округление до сотен, -1 - до десятков и т.п.
До какого знака вообще.
Эээ...
А если в системе в региональных стандартах в качестве разделителя указана точка?