アラビア数字→ローマ数字自動変換


実行モジュール

アラビア数字からローマ数字へ自動変換する Java アプレットです。

変換前の数値入力欄には、デフォルトで起動時の時間×100+分が与えられています。


アラビア数字→ローマ数字自動変換アプレット
アラビア数字→ローマ数字自動変換アプレット

 

つかいかた

  1. アラビア数字を、変換元の数値入力欄に入力する。
  2. ボタンを押す。
  3. 変換後の数値が表示されるので、コピーするなり適当に料理る。

 

 


ご参考

 

 


ご注意

 

 

 


ソースプログラム

/*
	(c)1987, 1999 A.Matsuda 
	pbuf range "1" .. "4999"
*/

import	java.awt.*;
import	java.awt.event.*;
import	java.awt.Toolkit.*;
import	java.applet.*;
import	java.util.*;
import	java.lang.*;
import	java.text.*;
import	java.lang.System.*;


class infieldTextListener	implements TextListener 
{
	public void textValueChanged(TextEvent e)
	{
		if( e.getID() == TextEvent.TEXT_VALUE_CHANGED )
		{
		}
	};
};

public class roman	extends java.applet.Applet
					implements ActionListener, ItemListener 
{
	Label label1, label2;
	boolean answerMode = false;
	infieldTextListener iftl;
	int fontsize = 48;
	String fontFace = "ゴシック";
	String choiceString[]={ "結果を大文字で表示", "結果を小文字で表示" };
	String convbuttonFace = "変換する";
	TextField  infield;
	TextField  outfield;
	Label outlabel;
	Button convbutton;
	Choice choice;
	int windowWidth = 500;
	int windowHeight= 150; 
	Font textFont;
	Font outTextFont;
	Font buttonFont;


	public String getAppletInfo() {
		return "アラビア数字→ローマ数字変換アプレット";
	};
	public String [][]getParameterInfo(){
		String [][] info = {
			{"convvalue", "1〜4999の範囲内の10進数またはHOURまたはYEARまたはMONTH", "文字列。[変換元アラビア数字 | HOUR | YEAR | MONTH ]"},
			{"answermode", "文字列", "trueでアンサーモード" },
			{"backgroundcolor", "16進RGB", "背景色" },
		};
		return info;
	};

	public void actionPerformed(ActionEvent e) {
		String arg = e.getActionCommand();

		if ( convbuttonFace.equals( arg ) ) {		//イベントってさぁ、ボタンフェイス
			String str;
			int maxlen ;
			boolean bUpperCase = false;
			if( isAnswerMode() == true ){
				bUpperCase = true;
				str = getDefaultConvValue();
				try{
					str = roman( str, bUpperCase );
				}
				catch( Exception except ){
					str = except.getMessage();
				}
				outlabel.setText( str );
				convbutton.setEnabled( false );
			}
			else{
				str = choice.getSelectedItem();
				if ( choiceString[ 0 ].equals( str ) ){
					bUpperCase = true;
				}
				str = infield.getText();
				try{
					str = roman( str, bUpperCase );
				}
				catch( Exception except ){
					str = except.getMessage();
				}
				outfield.setText( str );
			}
			showStatus( str );
		}

	};

	public void textValueChanged(TextEvent e)
	{
		if( e.getID() == (TextEvent.TEXT_VALUE_CHANGED) )
		{
		}
	}

	boolean isAnswerMode()
	{
		String val;
		val = getParameter( "answermode" );
		if( val == null ){
			return false;
		}
		if( "true".equals( val )){
			return true;
		}
		return false;
	}
		
	public String getDefaultConvValue()

	{
		String defaultValue;
		defaultValue = getParameter( "convvalue" );

		if( "MONTH".equals( defaultValue ) ){
			return new Integer( 
				Calendar.getInstance().get( Calendar.MONTH ) * 100 +
				Calendar.getInstance().get( Calendar.DATE ) ).toString();
		}
		
		if( "HOUR".equals( defaultValue ) ){
			return new Integer( 
				Calendar.getInstance().get( Calendar.HOUR ) * 100 +
				Calendar.getInstance().get( Calendar.MINUTE ) ).toString();
		}
		if( "YEAR".equals( defaultValue ) ){
			return new Integer( 
				Calendar.getInstance().get( Calendar.YEAR ) ).toString();
		}
		return defaultValue;
		
	}

	public Color getBackgroundColorParam()
	{
		String str;
		int i;
		str = getParameter( "backgroundcolor" );
		try{
			i = Integer.parseInt( str, 16 );
		}
		catch( NumberFormatException e ){
			return new Color( 0xFFFFFF );
		}
		
		return new Color( i );
	}
	
	public void itemStateChanged(ItemEvent e) {
	}

	public void init(){

		textFont    = new Font(fontFace, Font.BOLD, fontsize     );
		outTextFont = new Font(fontFace, Font.BOLD, fontsize     );
		buttonFont  = new Font(fontFace, Font.BOLD, fontsize / 2 );
	
		
		setBackground( getBackgroundColorParam() );
		
	
	
		if( isAnswerMode() == true ){
			windowWidth = 620;
			windowHeight= 75; 
			textFont    = new Font(fontFace, Font.BOLD, fontsize );
			convbuttonFace = "答え";
			convbutton = new Button( convbuttonFace );
			convbutton.addActionListener(this);		//リスナの登録
			convbutton.setFont( buttonFont );
			outlabel = new Label( "                                      ", Label.LEFT );
			outlabel.setFont( outTextFont );

			this.add(convbutton);
			this.add(outlabel);
		}
		else{
			windowWidth = 550;
			windowHeight= 150; 
			convbutton = new Button( convbuttonFace );
			convbutton.addActionListener(this);		//リスナの登録
			convbutton.setFont( buttonFont );
			infield = new TextField( "", 5 );
			infield.setSize( infield.getPreferredSize() ); 
			infield.addTextListener( iftl );		//リスナの登録
			infield.setFont( textFont );
			infield.setEditable( true );
			outfield = new TextField( "", 19 );
			outfield.setFont( outTextFont );
			outfield.setEditable( false );
			outfield.setSize( outfield.getPreferredSize() ); 
			choice = new Choice();
			for( int i = 0 ; i < choiceString.length; i++ ){
				choice.addItem(choiceString[i]);
			}

			resize( windowWidth,windowHeight );

			infield.setText( getDefaultConvValue() );

			outfield.setText( "変換結果表示域" );

			label1 = new Label("ここにアラビア数字を入力→" );
			label2 = new Label("↓変換結果表示" );
			this.add( label1 );
			this.add( label2 );
			this.add(infield);
			this.add(convbutton);
			this.add(choice);
			this.add(outfield);


		}
		
	}
	public int max( int a, int b )
	{
		if( a > b )
			return a;
		return b;
	}
	public int min( int a, int b )
	{
		if( a < b )
			return a;
		return b;
	}

	public void doLayout()
	{
		int x;
		int y;

		super.doLayout();
		if( label1 == null || label2 == null || choice == null || 
			convbutton == null || outfield == null || infield == null ){
			return ;
		}

		label1.setLocation( 0 , 0 );
		
		x = label1.getSize().width;
		
		infield.setLocation( x, 0 );
		
		label1.setLocation( infield.getLocation().x - label1.getSize().width , 0 );
				
		x += infield.getSize().width + 20;
		convbutton.setLocation( x, 2 );
		y = convbutton.getSize().height + 4;
		choice.setLocation( x, y );
		y = infield.getSize().height +10;
		outfield.setLocation( 0, y );

		label2.setLocation( 0, y - label2.getSize().height );
		

	}
	public void paint(Graphics g){
		g.setFont( textFont );
//		convbutton.paint( g );
//		choice.paint(g);
//		infield.paint(g);
//		outfield.paint(g);
	}
	public static void main(String argv[])
	{
	};
	public String roman( String buf , boolean bUpper ) throws Exception
	{
		byte astr[];
		String trimed;
		String num;
		int i;
		int len;
		String tbl[  ][  ] = {
			{ "", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix", },
			{ "", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc", },
			{ "", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm", },
			{ "", "m", "mm", "mmm", "mmmm", "", "", "", "", "", }
		};

		trimed = buf.trim();
		
		try{
			i = new Integer( trimed ).intValue();
		}
		catch( NumberFormatException e ){
			throw new Exception( "不正な数です" );
		}

		trimed = new Integer(i).toString() ;	//再変換
		
		len = trimed.length();

		astr = trimed.getBytes(); 
		
		StringBuffer roman = new StringBuffer();

		
		if( i >= 5000 || 0 >= i ){
			throw new Exception( "変換範囲外です" );
		}

		
		len = astr.length;
		
		i = 0;
		switch( len ){
			default:
				throw new Exception( "無効な数値です" );
			case 4:	// down through
				roman.append( tbl[ len - i - 1 ][ (astr[ i ] - '0') ] );
				i++;
			case 3:	// down through
				roman.append( tbl[ len - i - 1 ][ (astr[ i ] - '0') ] );
				i++;
			case 2:	// down through
				roman.append( tbl[ len - i - 1 ][ (astr[ i ] - '0') ] );
				i++;
			case 1:
				roman.append( tbl[ len - i - 1 ][ (astr[ i ] - '0') ] );
		}
		
		if( bUpper == true ){
			return roman.toString().toUpperCase();
		}
		return roman.toString();
	}
};

ソースプログラムのダウンロードはこちらをクリックして下さい。

 


ご注意

 


<ホームページへ> <ローマ数字変換へ> <アラビア数字→ローマ数字自動変換へ> <アラビア数字←→ローマ数字相互自動変換へ>

Copyright © MCMXCIX Ayumi Matsuda All rights reserved.