Delphi 将整数转换为罗马数字(字符串)2


本文整理自网络,侵删。

 
uRomanNumerals.pas
unit uRomanNumerals;

interface

uses
  System.SysUtils;

type
  TRomanNumRange = 0..3999;

  { TRomanNum }
  TRomanNum = class
  private
    const
      NumArr: array [0..12] of
        record n: Integer; c: string end = (
          (n:    1; c: 'I'), (n:   4; c: 'IV'),
          (n:    5; c: 'V'), (n:   9; c: 'IX'),
          (n:   10; c: 'X'), (n:  40; c: 'XL'),
          (n:   50; c: 'L'), (n:  90; c: 'XC'),
          (n:  100; c: 'C'), (n: 400; c: 'CD'),
          (n:  500; c: 'D'), (n: 900; c: 'CM'),
          (n: 1000; c: 'M'));
  public
    class function Roman(x: TRomanNumRange): string;
    class function Arabic(s: string): TRomanNumRange;
  end;

implementation

{ TRomanNum }

class function TRomanNum.Roman(x: TRomanNumRange): string;
begin
  result := '';
  var i := High(NumArr);
  while x > 0 do
    if x >= NumArr[i].n then
      begin
        result := result + NumArr[i].c;
        Dec(x, NumArr[i].n);
      end
    else
      Dec(i);
end;

class function TRomanNum.Arabic(s: string): TRomanNumRange;
begin
  result := 0;
  var i := High(NumArr);
  while s <> '' do
    if s.StartsWith(NumArr[i].c, True) then
      begin
        Inc(result, NumArr[i].n);
        s := s.Remove(0, NumArr[i].c.Length);
      end
    else
      begin
        Dec(i);
        if i < 0 then
          raise Exception.Create('Can not convert.');
      end;
end;
end.


program RomanTest;
{$APPTYPE CONSOLE}

uses
  System.SysUtils, uRomanNumerals;

begin
  Writeln(TRomanNum.Roman(   0));         //
  Writeln(TRomanNum.Roman(  12));         // XII
  Writeln(TRomanNum.Roman(  24));         // XXIV
  Writeln(TRomanNum.Roman(  42));         // XLII
  Writeln(TRomanNum.Roman(  49));         // XLIX
  Writeln(TRomanNum.Roman(  89));         // LXXXIX
  Writeln(TRomanNum.Roman( 299));         // CCXCIX
  Writeln(TRomanNum.Roman( 493));         // CDXCIII
  Writeln(TRomanNum.Roman(1960));         // MCMLX
  Writeln(TRomanNum.Roman(3999));         // MMMCMXCIX
  Writeln;

  Writeln(TRomanNum.Arabic(''         )); //    0
  Writeln(TRomanNum.Arabic('XII'      )); //   12
  Writeln(TRomanNum.Arabic('XXIV'     )); //   24
  Writeln(TRomanNum.Arabic('XLII'     )); //   42
  Writeln(TRomanNum.Arabic('XLIX'     )); //   49
  Writeln(TRomanNum.Arabic('LXXXIX'   )); //   89
  Writeln(TRomanNum.Arabic('CCXCIX'   )); //  299
  Writeln(TRomanNum.Arabic('CDXCIII'  )); //  493
  Writeln(TRomanNum.Arabic('MCMLX'    )); // 1960
  Writeln(TRomanNum.Arabic('MMMCMXCIX')); // 3999
  Readln;
end.

相关阅读 >>

Delphi android windows ios通用获取程序版本

Delphi 指定在ie浏览器或ie内核打开链接

Delphi vcl gif 动画

Delphi10.3通过rest单元使类和json数据互相转换

Delphi http post json示例

Delphi datasnap清除僵死连接

Delphi在文件结尾写入和读出数据

Delphi用idhttp.get访问一个网址返回403错误,但用ie浏览器访问正常

Delphi 检查父进程

Delphi 模仿qq截图

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...