אלגוריתם שמקבל מספר ומחזיר תיאור של המספר
-
http://code.613m.org/viewtopic.php?f=1&t=113&hilit=גימטריה
פורסם במקור בפורום CODE613 ב16/10/2015 14:19 (+03:00)
-
-
רחמים הקוד שלך תלוי בטבלת אקסס, להלן קוד עצמאי. אזהרה!!! הקוד לא נקי, הועתק ממשהו ישן שנכתב בשפה אחרת. עם טיפה שיפוץ הוא יהפוך לבובה של קוד.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HtmlTemplateEngine { public class ReplaceNumberToString { public string WordToSingleDigit(int Digit, bool Male, bool Base) { string functionReturnValue = null; // מערכים של מספרים string[] SeparateMale = new string[]{"", "אחד", "שנים", "שלשה", "ארבעה", "חמשה", "ששה", "שבעה", "שמונה", "תשעה", "עשרה", "עשרים", "שלשים", "ארבעים", "חמישים", "שישים", "שבעים", "שמונים", "תשעים"}; string[] BaseMale = new string[]{"", "אחד", "שני", "שלשת", "ארבעת", "חמשת", "ששת", "שבעת", "שמונת", "תשעת", "עשרת", "עשרים", "שלשים", "ארבעים", "חמישים", "שישים", "שבעים", "שמונים", "תשעים"}; string[] SeparateFemale = new string[]{"", "אחת", "שתים", "שלש", "ארבע", "חמש", "שש", "שבע", "שמונה", "תשע", "עשר", "עשרים", "שלשים", "ארבעים", "חמישים", "שישים", "שבעים", "שמונים", "תשעים"}; string[] BaseFemale = new string[]{"", "אחת", "שתי", "שלש", "ארבע", "חמש", "שש", "שבע", "שמונה", "תשע", "עשר", "עשרים", "שלשים", "ארבעים", "חמישים", "שישים", "שבעים", "שמונים", "תשעים"}; // הואיל והמערך מכיל גם מספרים של עשרים ומעלה // לכן יש לסדר את המספר הריאלי, ולהמיר אותו למספר המתאים למערך // כאן הוא מחזיר את המספר כפי שהוא נכון לגבי המערך if (Digit > 10) Digit = (Digit / 10) - 1 + 10; if (Male == true) { if (Base == true) { functionReturnValue = BaseMale[Digit]; return functionReturnValue; } else { functionReturnValue = SeparateMale[Digit]; return functionReturnValue; } } else if (Male == false) { if (Base == true) { functionReturnValue = BaseFemale[Digit]; return functionReturnValue; } else { functionReturnValue = SeparateFemale[Digit]; return functionReturnValue; } } return functionReturnValue; } public string ReplaceTextCurrency(double סכום) { string functionReturnValue = null; int שלמים = 0; int אגורות = 0; int עשרות_אלפים = 0; string טקסט_לשלמים = null; string טקסט_לעשרות_אלפים = null; string טקסט_לאגורות = null; string טקסט_למיליונים = null; if (סכום >= 1000000 | סכום == 0) { functionReturnValue = ""; return functionReturnValue; } שלמים = Convert.ToInt32(סכום); // שלמים = סכום; אגורות = Convert.ToInt32((סכום - Convert.ToInt32(סכום)) * 100); עשרות_אלפים = Convert.ToInt32((סכום - (סכום % 1000)) / 1000); if (עשרות_אלפים >= 10) שלמים = שלמים - (עשרות_אלפים * 1000);//Replace text טקסט_לשלמים = ReplaceTextFromDigit(שלמים, true, false); if (אגורות > 0) טקסט_לאגורות = " ו" + ReplaceTextFromDigit(אגורות, false, false) + " אגורות"; if (עשרות_אלפים > 10) טקסט_לעשרות_אלפים = ReplaceTextFromDigit(עשרות_אלפים, true, true); if (עשרות_אלפים >= 10) טקסט_לעשרות_אלפים = טקסט_לעשרות_אלפים + (עשרות_אלפים == 10 ? "עשרת אלפים" : " אלף") + (שלמים > 0 ? " ו" : " "); functionReturnValue = טקסט_לעשרות_אלפים + טקסט_לשלמים + (שלמים + עשרות_אלפים > 0 ? " שקלים" : "") + טקסט_לאגורות; return functionReturnValue; } public string ReplaceTextFromDigit(int מספר, bool Male, bool Base) { string functionReturnValue = null; // מחזיר טקסט ממספר עד לסכום של 9999 אלפים צריכים להיות מטופלים בנפרד בפונקציית המטבע //----------------------------- ERROR: Not supported in C#: OnErrorStatement if (מספר == 0) { functionReturnValue = ""; return functionReturnValue; } string טקסט_ליחידות = null; string טקסט_לעשרות = null; string טקסט_לעשרות_ויחידות = null; string טקסט_למאות = null; string טקסט_לאלפים = null; string טקסט_לעשרות_אלפים = null; string טקסט_לאגורות = null; string טקסט_לשלמים = null; int יחידות = 0; int עשרות = 0; int מאות = 0; int אלפים = 0; int עשרות_אלפים = 0; int יחידות_אגורות = 0; int עשרות_אגורות = 0; // מפרק את המספרים לערכים הדרושים // מכין את הערכים המספריים הדרושים יחידות = מספר % 10; עשרות = מספר % 100 - יחידות; מאות = (מספר % 1000 - עשרות - יחידות) / 100; אלפים = (מספר - (מספר % 1000)) / 1000; // מכין את הטקסט הדרוש // עושה שימוש בפונקציה מודולרית שנותנת ערכים למספרים בודדים // מכין את הטקסט לעשרות ויחידות if (יחידות + עשרות < 10) { טקסט_לעשרות_ויחידות = WordToSingleDigit(יחידות, Male, Base); } else if (יחידות + עשרות == 10) { טקסט_לעשרות_ויחידות = WordToSingleDigit(יחידות + עשרות, Male, false); } else if (יחידות + עשרות > 10 & יחידות + עשרות < 20) { טקסט_לעשרות_ויחידות = WordToSingleDigit(יחידות, Male, false); טקסט_לעשרות_ויחידות = טקסט_לעשרות_ויחידות + " " + WordToSingleDigit(עשרות, Male ^ true, false); } else if (יחידות + עשרות >= 20) { טקסט_ליחידות = WordToSingleDigit(יחידות, Male, false); טקסט_לעשרות = WordToSingleDigit(עשרות, Male, true); טקסט_לעשרות_ויחידות = טקסט_לעשרות + (יחידות > 0 ? " ו" : "") + טקסט_ליחידות; } if (עשרות + יחידות > 9 & עשרות + יחידות < 21 & מאות > 0) טקסט_לעשרות_ויחידות = "ו" + טקסט_לעשרות_ויחידות; // מכין את הטקסט למאות if (מאות == 1) { טקסט_למאות = "מאה"; } else if (מאות == 2) { טקסט_למאות = "מאתיים"; } else if (מאות > 2) { טקסט_למאות = WordToSingleDigit(מאות, false, true) + " מאות"; } // מכין את הטקסט לאלפים if (אלפים == 1) { טקסט_לאלפים = "אלף "; } else if (אלפים == 2) { טקסט_לאלפים = "אלפיים "; } else if (אלפים > 2 & אלפים < 10) { טקסט_לאלפים = WordToSingleDigit(אלפים, Male, true) + " אלפים"; } // מכין את הטקסטים כראוי להצגה על המסך עם ווי חיבור וכיוב if (אלפים > 0 & עשרות + יחידות == 0 & מאות > 0) טקסט_לאלפים = טקסט_לאלפים + " ו"; if (אלפים > 0 && ((עשרות + יחידות > 0) || (מאות > 0)) )//&& !(טקסט_לאלפים // ERROR: Unknown binary operator Like טקסט_לאלפים = טקסט_לאלפים + " "; טקסט_למאות = טקסט_למאות + ((עשרות + יחידות )> 0 ? " " : "") + ((אלפים > 0 | מאות > 0) & ((עשרות + יחידות < 10) & (עשרות + יחידות > 0)) ? "ו" : ""); string טקסט_לפני_הסרת_רווח = null; טקסט_לפני_הסרת_רווח = טקסט_לאלפים + טקסט_למאות + טקסט_לעשרות_ויחידות; // if (טקסט_לפני_הסרת_רווח // ERROR: Unknown binary operator Like //) // טקסט_לפני_הסרת_רווח = Strings.Right(טקסט_לפני_הסרת_רווח, Strings.Len(טקסט_לפני_הסרת_רווח) - 1); functionReturnValue = טקסט_לפני_הסרת_רווח; return functionReturnValue; } } }
פורסם במקור בפורום CODE613 ב16/10/2015 16:24 (+03:00)
-
בעולם המרכזיות אני נזקק לזה הרבה ולכן יש לך פה מחלקה בphp שבה אני משתמש, שים לב שהמילים שהוא מוציא הם מילים שאני שינתי בגלל הצרכים שלי להשתמש בקבצי קול ולא במילים עצמם, המחלקה עצמה לקוחה מאיפשהו בשם numbers to words וקיימת במספר שפות
require('Numbers/Words/lang.he.php'); $nw = new Numbers_Words(); $numw = $nw->toWords($number);
וזאת המחלקה עצמה:
<?php /** * Numbers_Words * * PHP version 4 * * Copyright (c) 1997-2006 The PHP Group * * This source file is subject to version 3.01 of the PHP license, * that is bundled with this package in the file LICENSE, and is * available at through the world-wide-web at * http://www.php.net/license/3_01.txt * If you did not receive a copy of the PHP license and are unable to * obtain it through the world-wide-web, please send a note to * license@php.net so we can mail you a copy immediately. * * @category Numbers * @package Numbers_Words * @author Hadar Porat <hpman28@gmail.com> * @license PHP 3.01 http://www.php.net/license/3_01.txt * @version SVN: $Id$ * @link http://pear.php.net/package/Numbers_Words */ /** * Class for translating numbers into Hebrew. * * @author Hadar Porat * @package Numbers_Words */ /** * Include needed files */ class Numbers_Words { // {{{ properties /** * Default Locale name * @var string * @access public */ var $locale = 'en_US'; // }}} // {{{ toWords() /** * Converts a number to its word representation * * @param integer $num An integer between -infinity and infinity inclusive :) * that should be converted to a words representation * @param string $locale Language name abbreviation. Optional. Defaults to * current loaded driver or en_US if any. * @param array $options Specific driver options * * @access public * @author Piotr Klaban <makler@man.torun.pl> * @since PHP 4.2.3 * @return string The corresponding word representation */ function toWords($num, $locale = 'he', $options = array()) { if (empty($locale)) { $locale = $this->locale; } if (empty($locale)) { $locale = 'he'; } //require_once "Words/lang.he.php"; $classname = "Numbers_Words_${locale}"; if (!class_exists($classname)) { return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file"); } $methods = get_class_methods($classname); if (!in_array('_toWords', $methods) && !in_array('_towords', $methods)) { return Numbers_Words::raiseError("Unable to find _toWords method in '$classname' class"); } if (!is_int($num)) { // cast (sanitize) to int without losing precision $num = preg_replace('/^[^\d]*?(-?)[ \t\n]*?(\d+)([^\d].*?)?$/', '$1$2', $num); } $truth_table = ($classname == get_class($this)) ? 'T' : 'F'; $truth_table .= (empty($options)) ? 'T' : 'F'; switch ($truth_table) { /** * We are a language driver */ case 'TT': return trim($this->_toWords($num)); break; /** * We are a language driver with custom options */ case 'TF': return trim($this->_toWords($num, $options)); break; /** * We are the parent class */ case 'FT': @$obj = new $classname; return trim($obj->_toWords($num)); break; /** * We are the parent class and should pass driver options */ case 'FF': @$obj = new $classname; return trim($obj->_toWords($num, $options)); break; } } // }}} // {{{ toCurrency() /** * Converts a currency value to word representation (1.02 => one dollar two cents) * If the number has not any fraction part, the "cents" number is omitted. * * @param float $num A float/integer/string number representing currency value * * @param string $locale Language name abbreviation. Optional. Defaults to en_US. * * @param string $int_curr International currency symbol * as defined by the ISO 4217 standard (three characters). * E.g. 'EUR', 'USD', 'PLN'. Optional. * Defaults to $def_currency defined in the language class. * * @return string The corresponding word representation * * @access public * @author Piotr Klaban <makler@man.torun.pl> * @since PHP 4.2.3 * @return string */ function toCurrency($num, $locale = 'en_US', $int_curr = '') { $ret = $num; @include_once "Numbers/Words/lang.${locale}.php"; $classname = "Numbers_Words_${locale}"; if (!class_exists($classname)) { return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file"); } $methods = get_class_methods($classname); if (!in_array('toCurrencyWords', $methods) && !in_array('tocurrencywords', $methods)) { return Numbers_Words::raiseError("Unable to find toCurrencyWords method in '$classname' class"); } @$obj = new $classname; // round if a float is passed, use Math_BigInteger otherwise if (is_float($num)) { $num = round($num, 2); } if (strpos($num, '.') === false) { return trim($obj->toCurrencyWords($int_curr, $num)); } $currency = explode('.', $num, 2); $len = strlen($currency[1]); if ($len == 1) { // add leading zero $currency[1] .= '0'; } elseif ($len > 2) { // get the 3rd digit after the comma $round_digit = substr($currency[1], 2, 1); // cut everything after the 2nd digit $currency[1] = substr($currency[1], 0, 2); if ($round_digit >= 5) { // round up without losing precision include_once "Math/BigInteger.php"; $int = new Math_BigInteger(join($currency)); $int = $int->add(new Math_BigInteger(1)); $int_str = $int->toString(); $currency[0] = substr($int_str, 0, -2); $currency[1] = substr($int_str, -2); // check if the rounded decimal part became zero if ($currency[1] == '00') { $currency[1] = false; } } } return trim($obj->toCurrencyWords($int_curr, $currency[0], $currency[1])); } // }}} // {{{ getLocales() /** * Lists available locales for Numbers_Words * * @param mixed $locale string/array of strings $locale * Optional searched language name abbreviation. * Default: all available locales. * * @return array The available locales (optionaly only the requested ones) * @author Piotr Klaban <makler@man.torun.pl> * @author Bertrand Gugger, bertrand at toggg dot com * * @access public * @static * @return mixed[] */ function getLocales($locale = null) { $ret = array(); if (isset($locale) && is_string($locale)) { $locale = array($locale); } $dname = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Words' . DIRECTORY_SEPARATOR; $dh = opendir($dname); if ($dh) { while ($fname = readdir($dh)) { if (preg_match('#^lang\.([a-z_]+)\.php$#i', $fname, $matches)) { if (is_file($dname . $fname) && is_readable($dname . $fname) && (!isset($locale) || in_array($matches[1], $locale))) { $ret[] = $matches[1]; } } } closedir($dh); sort($ret); } return $ret; } // }}} // {{{ raiseError() /** * Trigger a PEAR error * * To improve performances, the PEAR.php file is included dynamically. * * @param string $msg error message * * @return PEAR_Error */ function raiseError($msg) { include_once 'PEAR.php'; return PEAR::raiseError($msg); } // }}} } /** * Class for translating numbers into Hebrew. * * @category Numbers * @package Numbers_Words * @author Hadar Porat <hpman28@gmail.com> * @license PHP 3.01 http://www.php.net/license/3_01.txt * @link http://pear.php.net/package/Numbers_Words */ class Numbers_Words_he extends Numbers_Words { // {{{ properties /** * Locale name * @var string * @access public */ var $locale = 'he'; /** * Language name in English * @var string * @access public */ var $lang = 'Hebrew'; /** * Native language name * @var string * @access public */ var $lang_native = 'עברית'; /** * The word for the minus sign * @var string * @access private */ var $_minus = 'minus'; // minus sign /** * The sufixes for exponents (singular and plural) * Names partly based on: * http://home.earthlink.net/~mrob/pub/math/largenum.html * http://mathforum.org/dr.math/faq/faq.large.numbers.html * http://www.mazes.com/AmericanNumberingSystem.html * @var array * @access private */ var $_exponent = array( 0 => array(''), 3 => array('&digits/thousand'), 6 => array('&digits/milions'), 9 => array('bilion'), 12 => array('triloin'), 15 => array('quadrilion'), 18 => array('qwintiloion'), 21 => array('sextillion'), 24 => array('septillion'), 27 => array('octillion'), 30 => array('nonillion'), 33 => array('decillion'), 36 => array('undecillion'), 39 => array('duodecillion'), 42 => array('tredecillion'), 45 => array('quattuordecillion'), 48 => array('quindecillion'), 51 => array('sexdecillion'), 54 => array('septendecillion'), 57 => array('octodecillion'), 60 => array('novemdecillion'), 63 => array('vigintillion'), 66 => array('unvigintillion'), 69 => array('duovigintillion'), 72 => array('trevigintillion'), 75 => array('quattuorvigintillion'), 78 => array('quinvigintillion'), 81 => array('sexvigintillion'), 84 => array('septenvigintillion'), 87 => array('octovigintillion'), 90 => array('novemvigintillion'), 93 => array('trigintillion'), 96 => array('untrigintillion'), 99 => array('duotrigintillion'), // 100 => array('googol') - not latin name // 10^googol = 1 googolplex 102 => array('trestrigintillion'), 105 => array('quattuortrigintillion'), 108 => array('quintrigintillion'), 111 => array('sextrigintillion'), 114 => array('septentrigintillion'), 117 => array('octotrigintillion'), 120 => array('novemtrigintillion'), 123 => array('quadragintillion'), 126 => array('unquadragintillion'), 129 => array('duoquadragintillion'), 132 => array('trequadragintillion'), 135 => array('quattuorquadragintillion'), 138 => array('quinquadragintillion'), 141 => array('sexquadragintillion'), 144 => array('septenquadragintillion'), 147 => array('octoquadragintillion'), 150 => array('novemquadragintillion'), 153 => array('quinquagintillion'), 156 => array('unquinquagintillion'), 159 => array('duoquinquagintillion'), 162 => array('trequinquagintillion'), 165 => array('quattuorquinquagintillion'), 168 => array('quinquinquagintillion'), 171 => array('sexquinquagintillion'), 174 => array('septenquinquagintillion'), 177 => array('octoquinquagintillion'), 180 => array('novemquinquagintillion'), 183 => array('sexagintillion'), 186 => array('unsexagintillion'), 189 => array('duosexagintillion'), 192 => array('tresexagintillion'), 195 => array('quattuorsexagintillion'), 198 => array('quinsexagintillion'), 201 => array('sexsexagintillion'), 204 => array('septensexagintillion'), 207 => array('octosexagintillion'), 210 => array('novemsexagintillion'), 213 => array('septuagintillion'), 216 => array('unseptuagintillion'), 219 => array('duoseptuagintillion'), 222 => array('treseptuagintillion'), 225 => array('quattuorseptuagintillion'), 228 => array('quinseptuagintillion'), 231 => array('sexseptuagintillion'), 234 => array('septenseptuagintillion'), 237 => array('octoseptuagintillion'), 240 => array('novemseptuagintillion'), 243 => array('octogintillion'), 246 => array('unoctogintillion'), 249 => array('duooctogintillion'), 252 => array('treoctogintillion'), 255 => array('quattuoroctogintillion'), 258 => array('quinoctogintillion'), 261 => array('sexoctogintillion'), 264 => array('septoctogintillion'), 267 => array('octooctogintillion'), 270 => array('novemoctogintillion'), 273 => array('nonagintillion'), 276 => array('unnonagintillion'), 279 => array('duononagintillion'), 282 => array('trenonagintillion'), 285 => array('quattuornonagintillion'), 288 => array('quinnonagintillion'), 291 => array('sexnonagintillion'), 294 => array('septennonagintillion'), 297 => array('octononagintillion'), 300 => array('novemnonagintillion'), 303 => array('centillion'), 309 => array('duocentillion'), 312 => array('trecentillion'), 366 => array('primo-vigesimo-centillion'), 402 => array('trestrigintacentillion'), 603 => array('ducentillion'), 624 => array('septenducentillion'), // bug on a earthlink page: 903 => array('trecentillion'), 2421 => array('sexoctingentillion'), 3003 => array('millillion'), 3000003 => array('milli-millillion') ); /** * The array containing the digits (indexed by the digits themselves). * @var array * @access private */ var $_digits = array( 0 => '&digits/0', '&digits/h-1', '&digits/h-2', '&digits/h-3', '&digits/h-4', '&digits/h-5', '&digits/h-6', '&digits/h-7', '&digits/h-8', '&digits/h-9' ); var $_digits_ten = array( 2 => '&digits/20', '&digits/30', '&digits/40', '&digits/50', '&digits/60', '&digits/70', '&digits/80', '&digits/90' ); var $_digits_female = array( 0 => '&digits/0', '&digits/1', '&digits/2', '&digits/3', '&digits/4', '&digits/5', '&digits/6', '&digits/7', '&digits/8', '&digits/9' ); var $digits_hundreds = array( 0 => '', '&digits/100', '&digits/200', '&digits/300', '&digits/400', '&digits/500', '&digits/600', '&digits/700', '&digits/800', '&digits/900' ); var $digits_thousands = array( 0 => '', '&digits/1k', '&digits/2k', '&digits/3k', '&digits/4k', '&digits/5k', '&digits/6k', '&digits/7k', '&digits/8k', '&digits/9k' ); var $digits_hundreds_dthousands = array( 0 => '', '&digits/100k', '&digits/200k', '&digits/300k', '&digits/400k', '&digits/500k', '&digits/600k', '&digits/700k', '&digits/800k', '&digits/900k' ); var $digits_tens_thousands = array( 0 => '', '&digits/10k', '&digits/20&digits/thousand', '&digits/30&digits/thousand', '&digits/40&digits/thousand', '&digits/50&digits/thousand', '&digits/60&digits/thousand', '&digits/70&digits/thousand', '&digits/80&digits/thousand', '&digits/90&digits/thousand' ); /** * The word separator * @var string * @access private */ var $_sep = ''; var $_sep_hundred = '-'; var $_sep_ten = '&digits/ve'; /** * The currency names (based on the below links, * informations from central bank websites and on encyclopedias) * * @var array * @link http://30-03-67.dreamstation.com/currency_alfa.htm World Currency Information * @link http://www.jhall.demon.co.uk/currency/by_abbrev.html World currencies * @link http://www.shoestring.co.kr/world/p.visa/change.htm Currency names in English * @access private */ var $_currency_names = array( 'ALL' => array(array('lek'), array('qindarka')), 'AUD' => array(array('Australian dollar'), array('cent')), 'BAM' => array(array('convertible marka'), array('fenig')), 'BGN' => array(array('lev'), array('stotinka')), 'BRL' => array(array('real'), array('centavos')), 'BYR' => array(array('Belarussian rouble'), array('kopiejka')), 'CAD' => array(array('Canadian dollar'), array('cent')), 'CHF' => array(array('Swiss franc'), array('rapp')), 'CYP' => array(array('Cypriot pound'), array('cent')), 'CZK' => array(array('Czech koruna'), array('halerz')), 'DKK' => array(array('Danish krone'), array('ore')), 'EEK' => array(array('kroon'), array('senti')), 'EUR' => array(array('euro'), array('euro-cent')), 'GBP' => array(array('pound', 'pounds'), array('pence', 'pence')), 'HKD' => array(array('Hong Kong dollar'), array('cent')), 'HRK' => array(array('Croatian kuna'), array('lipa')), 'HUF' => array(array('forint'), array('filler')), 'ILS' => array(array('new sheqel','new sheqels'), array('agora','agorot')), 'ISK' => array(array('Icelandic kr�na'), array('aurar')), 'JPY' => array(array('yen'), array('sen')), 'LTL' => array(array('litas'), array('cent')), 'LVL' => array(array('lat'), array('sentim')), 'MKD' => array(array('Macedonian dinar'), array('deni')), 'MTL' => array(array('Maltese lira'), array('centym')), 'NIS' => array(array('shkalim'), array('nis')), // need more info if NIS or ILS 'NOK' => array(array('Norwegian krone'), array('oere')), 'PLN' => array(array('zloty', 'zlotys'), array('grosz')), 'ROL' => array(array('Romanian leu'), array('bani')), 'RUB' => array(array('Russian Federation rouble'), array('kopiejka')), 'SEK' => array(array('Swedish krona'), array('oere')), 'SIT' => array(array('Tolar'), array('stotinia')), 'SKK' => array(array('Slovak koruna'), array()), 'TRL' => array(array('lira'), array('kuru�')), 'UAH' => array(array('hryvna'), array('cent')), 'USD' => array(array('dollar'), array('cent')), 'YUM' => array(array('dinars'), array('para')), 'ZAR' => array(array('rand'), array('cent')) ); /** * The default currency name * @var string * @access public */ var $def_currency = 'NIS'; // }}} // {{{ _toWords() /** * Converts a number to its word representation * * @param integer $num An integer between -infinity and infinity inclusive :) * that need to be converted to words * @param integer $power The power of ten for the rest of the number to the right. * Optional, defaults to 0. * @param integer $powsuffix The power name to be added to the end of the return string. * Used internally. Optional, defaults to ''. * * @return string The corresponding word representation * * @access protected * @author Piotr Klaban <makler@man.torun.pl> * @since Numbers_Words 0.16.3 */ function _toWords($num, $power = 0, $powsuffix = '') { $ret = ''; // add a minus sign if (substr($num, 0, 1) == '-') { $ret = $this->_sep . $this->_minus; $num = substr($num, 1); } // strip excessive zero signs and spaces $num = trim($num); $num = preg_replace('/^0+/', '', $num); if (strlen($num)==6 and substr($num, 1, 2)!=00) { if (strlen($num) > 3 ) { $maxp = strlen($num)-1; $curp = $maxp; for ($p = $maxp; $p > 0; --$p) { // power // check for highest power if (isset($this->_exponent[$p])) { // send substr from $curp to $p $snum = substr($num, $maxp - $curp, $curp - $p + 1); $snum = preg_replace('/^0+/', '', $snum); if ($snum !== '') { $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; if ($powsuffix != '') { $cursuffix .= $this->_sep . $powsuffix; } $ret .= $this->_toWords($snum, $p, $cursuffix); } $curp = $p - 1; continue; } } $num = substr($num, $maxp - $curp, $curp - $p + 1); if ($num == 0) { return $ret; } }} elseif ($num == 0 || $num == '') { return $this->_sep . $this->_digits[0]; } if (strlen($num)==5 and substr($num, 0, 2)!=10) { if (strlen($num) > 3 ) { $maxp = strlen($num)-1; $curp = $maxp; for ($p = $maxp; $p > 0; --$p) { // power // check for highest power if (isset($this->_exponent[$p])) { // send substr from $curp to $p $snum = substr($num, $maxp - $curp, $curp - $p + 1); $snum = preg_replace('/^0+/', '', $snum); if ($snum !== '') { $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; if ($powsuffix != '') { $cursuffix .= $this->_sep . $powsuffix; } $ret .= $this->_toWords($snum, $p, $cursuffix); } $curp = $p - 1; continue; } } $num = substr($num, $maxp - $curp, $curp - $p + 1); if ($num == 0) { return $ret; } }} elseif ($num == 0 || $num == '') { return $this->_sep . $this->_digits[0]; } $tth =$hth = $th =$h = $t = $d = 0; switch(strlen($num)) { case 6: if (substr($num, -5, 2)==00){ $hth = (int)substr($num, -6, 1); } else { $h=(int)substr($num, -6, 1); } case 5: if (substr($num, -4, 1)==0){ $tth = (int)substr($num, -5, 1); } else { $t=(int)substr($num, -5, 1); } case 4: $th = (int)substr($num, -4, 1); case 3: $h = (int)substr($num, -3, 1); case 2: $t = (int)substr($num, -2, 1); case 1: $d = (int)substr($num, -1, 1); break; case 0: return; break; } if ($tth) { $ret .= $this->_sep . $this->digits_tens_thousands[$tth]; // in English only - add ' and' for [1-9]01..[1-9]99 // (also for 1001..1099, 10001..10099 but it is harder) // for now it is switched off, maybe some language purists // can force me to enable it, or to remove it completely // if (($t + $d) > 0) // $ret .= $this->_sep . 'and'; } if ($hth) { $ret .= $this->_sep . $this->digits_hundreds_dthousands[$hth]; // in English only - add ' and' for [1-9]01..[1-9]99 // (also for 1001..1099, 10001..10099 but it is harder) // for now it is switched off, maybe some language purists // can force me to enable it, or to remove it completely // if (($t + $d) > 0) // $ret .= $this->_sep . 'and'; } if ($th) { $ret .= $this->_sep .$this->digits_thousands[$th]; } if ($h) { $ret .= $this->_sep . $this->digits_hundreds[$h]; // in English only - add ' and' for [1-9]01..[1-9]99 // (also for 1001..1099, 10001..10099 but it is harder) // for now it is switched off, maybe some language purists // can force me to enable it, or to remove it completely // if (($t + $d) > 0) // $ret .= $this->_sep . 'and'; } // ten, twenty etc. switch ($t) { case 9: case 8: case 7: case 6: case 5: case 4: case 3: case 2: $ret .= $this->_sep . $this->_digits_ten[$t]; break; case 1: switch ($d) { case 0: $ret .= $this->_sep . (strlen($ret)>1?'&digits/ve':'') .'&digits/h-10'; break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: $ret .= $this->_sep .(strlen($ret)>1?'&digits/ve':''). substr( $this->_digits[$d], 0, -1) . (10+$d); break; } break; } if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> // add minus sign between [2-9] and digit if ($t > 1) { $ret .= $this -> _sep_ten . $this->_digits[$d]; } else { if (strlen($ret)>0) { $ret .= $this->_sep . '&digits/ve' . $this->_digits[$d]; } else { $ret .= $this->_sep . $this->_digits[$d]; } } } if ($power > 0) { if (isset($this->_exponent[$power])) { $lev = $this->_exponent[$power]; } if (!isset($lev) || !is_array($lev)) { return null; } $ret .= $this->_sep . $lev[0]; } if ($powsuffix != '') { $ret .= $this->_sep . $powsuffix; } return $ret; } // }}} // {{{ toCurrencyWords() /** * Converts a currency value to its word representation * (with monetary units) * * @param integer $int_curr An international currency symbol * as defined by the ISO 4217 standard (three characters) * @param integer $decimal A money total amount without fraction part (e.g. amount of dollars) * @param integer $fraction Fractional part of the money amount (e.g. amount of cents) * Optional. Defaults to false. * @param integer $convert_fraction Convert fraction to words (left as numeric if set to false). * Optional. Defaults to true. * * @return string The corresponding word representation for the currency * * @access public * @author Piotr Klaban <makler@man.torun.pl> * @since Numbers_Words 0.4 */ function toCurrencyWords($int_curr, $decimal, $fraction = false, $convert_fraction = true) { $int_curr = strtoupper($int_curr); if (!isset($this->_currency_names[$int_curr])) { $int_curr = $this->def_currency; } $curr_names = $this->_currency_names[$int_curr]; $ret = trim($this->_toWords($decimal)); $lev = ($decimal == 1) ? 0 : 1; if ($lev > 0) { if (count($curr_names[0]) > 1) { $ret .= $this->_sep . $curr_names[0][$lev]; } else { $ret .= $this->_sep . $curr_names[0][0] . ''; } } else { $ret .= $this->_sep . $curr_names[0][0]; } if ($fraction !== false) { if ($convert_fraction) { $ret .= $this->_sep . trim($this->_toWords($fraction)); } else { $ret .= $this->_sep . $fraction; } $lev = ($fraction == 1) ? 0 : 1; if ($lev > 0) { if (count($curr_names[1]) > 1) { $ret .= $this->_sep . $curr_names[1][$lev]; } else { $ret .= $this->_sep . $curr_names[1][0] . ''; } } else { $ret .= $this->_sep . $curr_names[1][0]; } } return $ret; } // }}} }
מקווה שעזרתי ושהphp לא מיותר כאן
פורסם במקור בפורום CODE613 ב16/10/2015 17:00 (+03:00)
-
תודה רבה על כל התגובות!!
לרחמים, אז באמת הקוד תלוי בDB ואני מעדיף אחד עצמאי..
כמו כן, לא בדיוק הבנתי את מהלך הקוד שלו.. ניסיתי להמיר את הVB לc# כאן אבל משום מה הוא כותב לי שיש שגיאה ולא מוכן לעשות זאת.
בכל אופן תודה רבה!!
חיים, מעולה שהבאת קוד לPHP אולי יעזור לאחרים.. אני כרגע (מקווה שבהמשך בע"ה כן) עוד לא מכיר את השפה הזאת
אריכטקט הקוד שהבאת פועל מצויין!! תודה רבה!
יש לו רק באג אחד - אם סכום האגורות מ50 ומעלה הוא מעגל את זה כלפי מעלה <!-- s:-( --><img src="{SMILIES_PATH}/icon_e_sad.gif" alt=":-(" title="עצוב" /><!-- s:-( -->
מקור הבעיה הוא בשורה הזאת:אגורות = Convert.ToInt32((סכום - Convert.ToInt32(סכום)) * 100);
כיון שהפונקציה של ההמרה מדאבל לINt מעגלת אוט' כלפי מעלה כאשר המספר אחרי הנקודה גדול או שווה לחמישים. וממילא התוצאה שמתקבלת היא שלילית, ונמצא שהתוצאה הסופית שהפונקציה מחזירה היא רק של השלמים ולא של האגורות.
את הסרת הריוח המיותר ביצעתי ע"י השורה הבאה:טקסט_לפני_הסרת_רווח = טקסט_לפני_הסרת_רווח.Trim();
את שאר ההערות שלך על שגיאות לא בדיוק הבנתי למה התכוונת..
כמו כן, הוא לא מטפל בסכום שמעל מיליון ש"ח.. אני עובד להוסיף את זה, (אם כי זה לא כ"כ שימושי..) ונראה מה יצא..
בכל אופן אהבתי מאד את האלגוריתם.תודה לכולם על העזרה!!
שבוע טוב!פורסם במקור בפורום CODE613 ב18/10/2015 00:06 (+03:00)
-
בנוגע לטבלה, פשוט תכניס אותה לתוך אוביקטים או מערכים.
תסתכל בלינק של מאט בלינק שאני הבאתי
מודול 1 שולף ממקום ראשון במערך (שבו יש מערך עם ספרות 1-10 במילים).
מודול 10 משתמש במקום שני, בו יש את המילה הנוספת (עשרה)
מודול 100 - מאות
1000 - "ת אלפים"
וכן הלאהאח"כ יש כמה החלפות כמו "שתים מאה" > "מאתיים".
פורסם במקור בפורום CODE613 ב18/10/2015 00:25 (+03:00)
-
בנוגע לטבלה, פשוט תכניס אותה לתוך אוביקטים או מערכים.
תסתכל בלינק של מאט בלינק שאני הבאתי
מודול 1 שולף ממקום ראשון במערך (שבו יש מערך עם ספרות 1-10 במילים).
מודול 10 משתמש במקום שני, בו יש את המילה הנוספת (עשרה)
מודול 100 - מאות
1000 - "ת אלפים"
וכן הלאהאח"כ יש כמה החלפות כמו "שתים מאה" > "מאתיים".
הלינק שהבאת עוסק בהמרה לגימטריה,לא?
פורסם במקור בפורום CODE613 ב18/10/2015 00:35 (+03:00)
-
בנוגע למה שהצעת זה בדיוק מה שארכיטקט עשה.
הכניס לארבעה מערכים (כיון שאת האגורות משתמשים בלשון נקבה, ואת השקלים בזכר. וכמו כן, יש לך את הנסמכים (שלשת, עשרת וכו').
הבעיה היא לא המערך, הבעיה זה הפירוק של המספר לגורמים והתיאור של כל ספרה (כולל אגורות).פורסם במקור בפורום CODE613 ב18/10/2015 00:40 (+03:00)
-
זה לא קוד מושלם ועובד
אבל לענ"ד אמור לתת כיון טובvar theSum = '1245' var theSumToWords = '' var someWords = ['אחד','שתים','שלוש','ארבע','חמש','שש','שבע','שמונה','תישע'] var greatWords = ['','מאות','עשרה ','ת אלפים',] var hcflr = 1 for ( var i = 0; i < theSum.length; i++ ) { var modul = theSum % hcflr hcflr *= 10 theSumToWords = someWords[modul] + greatWords[i] + theSumToWords }
פורסם במקור בפורום CODE613 ב18/10/2015 01:06 (+03:00)