FR [2882363] - AmtInWords_SR
https://sourceforge.net/tracker/?func=detail&atid=883808&aid=2882363&group_id=176962
This commit is contained in:
parent
bec45112ab
commit
99dcfb7e4e
|
@ -0,0 +1,263 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution * Copyright (C)
|
||||
* 1999-2006 ComPiere, Inc. All Rights Reserved. * This program is free
|
||||
* software; you can redistribute it and/or modify it * under the terms version
|
||||
* 2 of the GNU General Public License as published * by the Free Software
|
||||
* Foundation. This program is distributed in the hope * that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied * warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General
|
||||
* Public License for more details. * You should have received a copy of the GNU
|
||||
* General Public License along * with this program; if not, write to the Free
|
||||
* Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.compiere.util;
|
||||
|
||||
/**
|
||||
*Amount in Words for Serbia.
|
||||
* @author Nikola Petkov -The class is based on the AmtInWords_EN.java written
|
||||
* by jjanke
|
||||
*/
|
||||
public class AmtInWords_SR
|
||||
implements AmtInWords
|
||||
{
|
||||
|
||||
/**
|
||||
* AmtInWords_RS
|
||||
*/
|
||||
public AmtInWords_SR()
|
||||
{
|
||||
super ();
|
||||
}
|
||||
|
||||
private static final String zero = "Nula";
|
||||
|
||||
private static final String negative = "minus";
|
||||
|
||||
private static final String concat = "i";
|
||||
|
||||
private static final String din[] =
|
||||
{"dinar", "dinara"};
|
||||
|
||||
/** Thousands plus */
|
||||
private static final String[][] majorNames =
|
||||
{
|
||||
{"", "", ""},
|
||||
{"Hiljadu", "Hiljade", "Hiljada"},
|
||||
{"Milion", "Miliona", "Miliona"},
|
||||
{"Milijarda", "Milijarde", "Milijardi"},
|
||||
{"Bilion", "Biliona", "Biliona"},
|
||||
{"Bilijarda", "Bilijarde", "Bilijardi"},
|
||||
{"Trilion", "Triliona", "Triliona"}};
|
||||
|
||||
/** Ten to Ninety */
|
||||
private static final String[] tensNames =
|
||||
{"", "Deset", "Dvadeset", "Trideset", "Četrdeset", "Pedeset", "Šestdeset",
|
||||
"Sedamdeset", "Osamdeset", "Devedeset"};
|
||||
|
||||
/* 100-1000 */
|
||||
private static final String[] hundredNames =
|
||||
{"", "JednaStotina", "DveStotine", "TriStotine", "ČetiriStotine",
|
||||
"PetStotina", "ŠestStotina", "SedamStotina", "OsamStotina",
|
||||
"DevetStotina"};
|
||||
|
||||
/** numbers to 19 */
|
||||
private static final String[][] numNames =
|
||||
{
|
||||
{"", ""},
|
||||
{"Jedan", "Jedna"},
|
||||
{"Dva", "Dve"},
|
||||
{"Tri", "Tri"},
|
||||
{"Četiri", "Četiri"},
|
||||
{"Pet", "Pet"},
|
||||
{"Šest", "Šest"},
|
||||
{"Sedam", "Sedam"},
|
||||
{"Osam", "Osam"},
|
||||
{"Devet", "Devet"},
|
||||
{"Deset", "Deset"},
|
||||
{"Jedanaest", "Jedanast"},
|
||||
{"Dvanaeset", "Dvanaest"},
|
||||
{"Trinaeset", "Trinaest"},
|
||||
{"Četrnaest", "Četrnaest"},
|
||||
{"Petnaest", "Petnaest"},
|
||||
{"Šestnaest", "Šestnaest"},
|
||||
{"Sedamnaest", "Sedamnaest"},
|
||||
{"Osamnaest", "Osamnaest"},
|
||||
{"Devetnaest", "Devetnaest"}};
|
||||
|
||||
/**
|
||||
*Convert Less Than One Thousand
|
||||
* @param number
|
||||
*@return amt
|
||||
*/
|
||||
private String convertLessThanOneThousand(int number, int w)
|
||||
{
|
||||
String soFar;
|
||||
// Below 20
|
||||
if (number % 100 < 20)
|
||||
{
|
||||
soFar = numNames[number % 100][w];
|
||||
number /= 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
soFar = numNames[number % 10][w];
|
||||
number /= 10;
|
||||
if (soFar.compareTo ("") == 0)
|
||||
{
|
||||
soFar = tensNames[number % 10];
|
||||
}
|
||||
else
|
||||
{
|
||||
soFar = tensNames[number % 10] + concat + soFar;
|
||||
}
|
||||
number /= 10;
|
||||
}
|
||||
if (number == 0)
|
||||
return soFar;
|
||||
return hundredNames[number] + soFar;
|
||||
} // convertLessThanOneThousand
|
||||
|
||||
/**
|
||||
*Convert
|
||||
* @param number
|
||||
*@return amt
|
||||
*/
|
||||
private String convert(long number)
|
||||
{
|
||||
/* special case */
|
||||
if (number == 0)
|
||||
{
|
||||
return zero;
|
||||
}
|
||||
String prefix = "";
|
||||
if (number < 0)
|
||||
{
|
||||
number = -number;
|
||||
prefix = negative + " ";
|
||||
}
|
||||
String soFar = "";
|
||||
int place = 0;
|
||||
do
|
||||
{
|
||||
long n = number % 1000;
|
||||
if (n != 0)
|
||||
{
|
||||
String s = convertLessThanOneThousand ((int)n, place == 1 ? 1
|
||||
: 0);
|
||||
if ((place == 1) && (s.compareTo (numNames[1][1]) == 0))
|
||||
{
|
||||
soFar = majorNames[place][0] + soFar;
|
||||
}
|
||||
else
|
||||
{
|
||||
long lastDigit = n % 10;
|
||||
long lastTwoDigits = n % 100;
|
||||
boolean teen = (lastTwoDigits > 10 && lastTwoDigits < 20);
|
||||
String major = null;
|
||||
if (lastDigit == 1 && !teen)
|
||||
{
|
||||
major = majorNames[place][0];
|
||||
}
|
||||
// 2,3,4,22,23,24,32,33,34 ...
|
||||
else if ((lastDigit > 1 && lastDigit < 5) && !teen)
|
||||
{
|
||||
major = majorNames[place][1];
|
||||
}
|
||||
else
|
||||
{
|
||||
// 0,5,6,7,8,9,11,12,13,...,19
|
||||
major = majorNames[place][2];
|
||||
}
|
||||
soFar = s + major + soFar;
|
||||
}
|
||||
}
|
||||
place++;
|
||||
number /= 1000;
|
||||
}
|
||||
while (number > 0);
|
||||
return (prefix + soFar).trim ();
|
||||
} // convert
|
||||
|
||||
/**************************************************************************
|
||||
*Get Amount in Words
|
||||
* @param amount numeric amount (352.80)
|
||||
*@return amount in words (three*five*two 80/100)
|
||||
*@throws Exception
|
||||
*/
|
||||
public String getAmtInWords(String amount)
|
||||
throws Exception
|
||||
{
|
||||
if (amount == null)
|
||||
return amount;
|
||||
StringBuffer sb = new StringBuffer ();
|
||||
amount = amount.replaceAll (" ", "").replaceAll ("\u00A0", "");
|
||||
char sep = amount.contains (",") ? ',' : '.'; // Try to determine the
|
||||
// separator either
|
||||
// comma or a full stop
|
||||
int pos = amount.lastIndexOf (sep);
|
||||
long dins = Long.parseLong ((pos >= 0) ? amount.substring (0, pos)
|
||||
: amount);
|
||||
sb.append (convert (dins) + " " + din[dins == 1 ? 0 : 1]);
|
||||
if (pos > 0)
|
||||
{
|
||||
String para = amount.substring (pos + 1);
|
||||
if (para.length () > 2)
|
||||
{
|
||||
para = para.substring (0, 2);
|
||||
}
|
||||
sb.append (" " + concat + " ").append (para).append ("/100"); // para"
|
||||
}
|
||||
return sb.toString ();
|
||||
} // getAmtInWords
|
||||
|
||||
/**
|
||||
*Test Print
|
||||
* @param amt amount
|
||||
*/
|
||||
private void print(String amt)
|
||||
{
|
||||
try
|
||||
{
|
||||
System.out.println (amt + " = " + getAmtInWords (amt));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace ();
|
||||
}
|
||||
} // print
|
||||
|
||||
/**
|
||||
*Test
|
||||
* @param args ignored
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
AmtInWords_SR aiw = new AmtInWords_SR ();
|
||||
aiw.print ("0.23");
|
||||
aiw.print ("23");
|
||||
aiw.print ("0,23");
|
||||
aiw.print ("1,23");
|
||||
aiw.print ("12,345");
|
||||
aiw.print ("123,45");
|
||||
aiw.print ("1 234,56");
|
||||
aiw.print ("12 345,78");
|
||||
aiw.print ("123 457,89");
|
||||
aiw.print ("1 234 578,90");
|
||||
aiw.print ("10,00");
|
||||
aiw.print ("50,00");
|
||||
aiw.print ("100,00");
|
||||
aiw.print ("300,00");
|
||||
aiw.print ("1 000,00");
|
||||
aiw.print ("3 000,00");
|
||||
aiw.print ("10 000,00");
|
||||
aiw.print ("1 000 000,00");
|
||||
aiw.print ("100 000 000,00");
|
||||
aiw.print ("100 000 000 000,00");
|
||||
aiw.print ("100 000 000 000 000,00");
|
||||
aiw.print ("1 000 000 000 000 000,00");
|
||||
aiw.print ("1 000 000 000 000 000 000,00");
|
||||
} // main
|
||||
} // AmtInWords_RS
|
||||
|
||||
|
Loading…
Reference in New Issue