delphi 将整数转换为罗马数字(字符串)2  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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.


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.18520402908325 seconds