Понадобилось форматировать число по триадам для улучшения читаемости.
В хелпе не нашел ничего подходящего.
Сделал функцию с несколько расширенными возможностями
Procedure.s IntToTrain(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад
Причем для эксперимента сделал два варианта - со сороковыми операциями и без них (на CopyMemory)
так вот 10 млн. цикл с 12-ти значным десятичным числом
для первого варианта занял 26 сек, для второго - 16 сек.
для числа из 1 знака - оба варианта ~8сек
Код:Procedure.s IntToTrain(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад tmp$=Str(In) tmpLen=Len(tmp$) ; количество "триад" FieldQty=Int(tmpLen/FieldLen): If (tmpLen % FieldLen)>0: FieldQty+1: EndIf result$="" p=tmpLen+1 For i=1 To FieldQty p-FieldLen If p<1 If FieldQty>1 result$=Left(tmp$,FieldLen+p-1)+delimiter+result$ Else result$=Left(tmp$,FieldLen+p-1) EndIf Else If i=1 result$=Mid(tmp$,p,FieldLen) ;+delimiter+result$ Else result$=Mid(tmp$,p,FieldLen)+delimiter+result$ EndIf EndIf Next ProcedureReturn result$ EndProcedure Procedure.s IntToTrain2(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад tmp$=Str(In) tmpLen=Len(tmp$) dlmLen=Len(delimiter) NewLen=0 ; количество "триад" и новая длина FieldQty=Int(tmpLen/FieldLen) NewLen=FieldQty*FieldLen n=tmpLen % FieldLen If n>0 FieldQty+1 NewLen+n EndIf NewLen+(FieldQty-1)*dlmLen *Result=AllocateMemory(NewLen+1) FillMemory(*Result, NewLen+1) pr=0 ;pointer of result If n>0 ; перенос первой неполной триады CopyMemory(@tmp$, *Result, n) pr+n If FieldQty>1 CopyMemory(@delimiter, *Result+pr, dlmLen) pr+dlmLen EndIf EndIf p=n+1 While p<tmpLen ; перенос полных триад CopyMemory(@tmp$+p-1, *Result+pr, FieldLen) pr+FieldLen If pr<NewLen CopyMemory(@delimiter, *Result+pr, dlmLen) pr+dlmLen EndIf p+FieldLen Wend ProcedureReturn PeekS(*Result , NewLen ) EndProcedure
А все потому что первый вариант на каждую триаду выполняет такую операцию
result$=Mid(tmp$,p,FieldLen)+delimiter+result$
а второй такую
CopyMemory(@tmp$+p-1, *Result+pr, FieldLen)
CopyMemory(@delimiter, *Result+pr, dlmLen)