Commits

Anonymous committed 02ecc31

init

--
user: Burak Gursoy <burak@gursoy.org>
branch 'default'
added Build.PL
added Changes
added MANIFEST
added META.yml
added Makefile.PL
added README
added lib/Lingua/TR/Numbers.pm
added lib/Lingua/TR/NumbersTR.pod
added t/01-pod.t
added t/02-pod-coverage.t
added t/20_main_integers.t
added t/30_v1_tests.t

  • Participants

Comments (0)

Files changed (12)

+use 5.006;
+use Module::Build;
+
+Module::Build->new(
+   module_name => 'Lingua::TR::Numbers',
+   license     => 'perl',
+   requires    => {
+      'Test::More' => '0.40',
+   },
+   recommends  => {},
+   sign        => 0,
+   dist_author => 'Burak Gursoy <burak@cpan.org>',
+)->create_build_script;
+Revision history for Perl extension Lingua::TR::Numbers.
+
+Time zone is GMT+2.
+
+0.21 Sun Jan 20 19:42:27 2008
+    => Test::More is now a prereq.
+    => Removed skip.test & fixed 01-pod.t for legacy perls.
+    => Converted all EOL to LF.
+    => No functional change.
+
+0.2 Wed Oct 18 21:14:02 2006
+    => Internal cleanup and some fixes.
+
+0.1 Sat Oct 14 22:21:12 2006
+    => First release.
+lib/Lingua/TR/Numbers.pm
+lib/Lingua/TR/NumbersTR.pod
+t/01-pod.t
+t/02-pod-coverage.t
+t/20_main_integers.t
+t/30_v1_tests.t
+Makefile.PL
+Build.PL
+Changes
+MANIFEST
+README
+META.yml

META.yml

Empty file added.
+use 5.006;
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+   'NAME'         => 'Lingua::TR::Numbers',
+   'VERSION_FROM' => 'lib/Lingua/TR/Numbers.pm',
+   'PREREQ_PM'    => {
+      'Test::More' => '0.40',
+   },
+   ($] >= 5.005 ? (
+   AUTHOR   => 'Burak Gursoy <burak@cpan.org>',
+   ABSTRACT => 'Converts numbers into Turkish text',
+   ) : ()),
+   PL_FILES => {},
+);
+Lingua::TR::Numbers
+===================
+
+Converts numbers into Turkish text.
+
+Read the module's POD for documentation and examples.
+
+INSTALLATION
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+or under Windows:
+
+   perl Makefile.PL
+   nmake
+   nmake test
+   nmake install
+
+DEPENDENCIES
+
+Test::More is needed for running distro tests.
+
+COPYRIGHT
+
+Copyright (c) 2006-2008 Burak G�rsoy. All rights reserved.
+
+This module is based on and includes modified code 
+portions of Sean M. Burke's Lingua::EN::Numbers.
+
+Lingua::EN::Numbers is Copyright (c) 2005, Sean M. Burke.
+
+LICENSE
+
+This library is free software; you can redistribute it and/or modify 
+it under the same terms as Perl itself, either Perl version 5.8.8 or, 
+at your option, any later version of Perl 5 you may have available.

lib/Lingua/TR/Numbers.pm

+#BEGIN { if($] < 5.006) { package utf8; $INC{'utf8.pm'} = 1; } }
+package Lingua::TR::Numbers;
+use 5.006;
+use utf8;
+use strict;
+use vars qw(@ISA $VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS);
+#use constant IS_LEGACY => $] < 5.006;
+use Exporter ();
+
+BEGIN { *DEBUG = sub () {0} unless defined &DEBUG } # setup a DEBUG constant
+
+$VERSION     = '0.21';
+
+@ISA         = qw( Exporter              );
+@EXPORT_OK   = qw( num2tr num2tr_ordinal );
+%EXPORT_TAGS =   ( all => \@EXPORT_OK    );
+
+my($RE_VOWEL, %D, %Mult, %Card2ord, %Card2ordTR);
+
+POPULATE: {
+  @D{ 0,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9  } = qw| sıfır bir iki   üç   dört beş  altı   yedi   sekiz  dokuz  |;
+  @D{   10,20,30,40,50,60,70,80,90 } = qw|       on  yirmi otuz kırk elli altmış yetmiş seksen doksan |;
+
+  @Card2ord{  qw| bir     iki    üç     dört     beş     altı    yedi    sekiz     dokuz     |}
+            = qw| birinci ikinci üçüncü dördüncü beşinci altıncı yedinci sekizinci dokuzuncu |;
+
+  @Card2ordTR{ qw|a   e   ı   i   u   ü   o   ö   |}
+            =  qw|ncı nci ncı nci ncu ncü ncu ncü |;
+
+  $RE_VOWEL = join '', keys %Card2ordTR;
+  $RE_VOWEL = qr{([$RE_VOWEL])}o;
+
+  my @large = qw|
+                   bin       milyon    milyar    trilyon  katrilyon
+                   kentilyon seksilyon septilyon oktilyon nobilyon
+                   desilyon
+                |;
+  my $c = 0;
+  $Mult{$c++} = $_ for '', @large;
+}
+
+#==========================================================================
+
+sub num2tr_ordinal {
+   #  Cardinals are [bir     iki    üç     ...]
+   #  Ordinals  are [birinci ikinci üçüncü ...]
+  
+  return undef unless defined $_[0] and length $_[0];
+  my($x) = $_[0];
+  
+  $x = num2tr($x);
+  return $x unless $x;
+  $x =~ s/(\w+)$//s   or return $x . ".";
+  my $last = $1;
+  my @l = split //, $last;
+  my $ok;
+  my $step = 1;;
+  for my $l (reverse @l) {
+     next if not $l;
+     if($l =~ $RE_VOWEL) {
+        $ok = $1;
+        last;
+     }
+     $step++;
+  }
+  if(!$ok) {
+     #return $last if IS_LEGACY;
+     #die "Can not happen: '$last'";
+     return undef;
+  }
+
+  $last = $Card2ord{$last} || sub {
+     my $val = $Card2ordTR{$ok};
+     return $last . $val if $step == 1;
+     my $letter = (split //, $val)[-1];
+     return $last.$letter.$val;
+  }->();
+
+  return "$x$last";
+}
+
+#==========================================================================
+
+sub num2tr {
+  my $x = $_[0];
+  return undef unless defined $x and length $x;
+
+  return 'sayı-değil'     if $x eq 'NaN';
+  return 'eksi sonsuz' if $x =~ m/^\+inf(?:inity)?$/si;
+  return 'artı sonsuz' if $x =~ m/^\-inf(?:inity)?$/si;
+  return      'sonsuz' if $x =~  m/^inf(?:inity)?$/si;
+
+  return $D{$x} if exists $D{$x};  # the most common cases
+
+  # Make sure it's not in scientific notation:
+  {  my $e = _e2tr($x);  return $e if defined $e; }
+  
+  my $orig = $x;
+
+  $x =~ s/,//g; # nix any commas
+
+  my $sign;
+  $sign = $1 if $x =~ s/^([-+])//s;
+  
+  my($int, $fract);
+  if(    $x =~ m<^\d+$>          ) { $int = $x }
+  elsif( $x =~ m<^(\d+)\.(\d+)$> ) { $int = $1; $fract = $2 }
+  elsif( $x =~ m<^\.(\d+)$>      ) { $fract = $1 }
+  else {
+    DEBUG and print "Not a number: \"orig\"\n";
+    return undef;
+  }
+  
+  DEBUG and printf " Working on Sign[%s]  Int2tr[%s]  Fract[%s]  < \"%s\"\n",
+   map defined($_) ? $_ : "nil", $sign, $int, $fract, $orig;
+  
+  return join ' ', grep defined($_) && length($_),
+    _sign2tr($sign),
+    _int2tr($int),
+    _fract2tr($fract),
+  ;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _sign2tr {
+  return undef unless defined $_[0] and length $_[0];  
+  return 'eksi' if $_[0] eq '-';
+  return 'artı' if $_[0] eq '+';
+  return "WHAT_IS_$_[0]";
+}
+
+sub _fract2tr {    # "1234" => "point one two three four"
+  return undef unless defined $_[0] and length $_[0];  
+  my $x = $_[0];
+  return join ' ', 'nokta', map $D{$_}, split '', $x;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# The real work:
+
+sub _int2tr {
+  return undef unless defined $_[0] and length $_[0]
+   and $_[0] =~ m/^\d+$/s;
+
+  my($x) = $_[0];
+
+  return $D{$x} if defined $D{$x};  # most common/irreg cases
+  
+  if( $x =~ m/^(.)(.)$/ ) {
+    return  $D{$1 . '0'} . ' ' . $D{$2};
+     # like    forty        -     two
+      # note that neither bit can be zero at this point
+     
+  } elsif( $x =~ m/^(.)(..)$/ ) {
+    my $tmp = $1 == 1 ? '' : $D{$1}.' ';
+    my($h, $rest) = ($tmp.'yüz', $2);
+    return $h if $rest eq '00';
+    return "$h " . _int2tr(0 + $rest);
+  } else {
+    return _bigint2tr($x);
+  }
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _bigint2tr {
+  return undef unless defined $_[0] and length $_[0]
+   and $_[0] =~ m/^\d+$/s;
+
+  my($x) = $_[0];
+
+  my @chunks;  # each:  [ string, exponent ]
+  
+  {
+    my $groupnum = 0;
+    my $num;
+    while( $x =~ s<(\d{1,3})$><>s ) { # pull at most three digits from the end
+      $num = $1 + 0;
+      unshift @chunks, [ $num, $groupnum ] if $num;
+      ++$groupnum;
+    }
+    return $D{'0'} unless @chunks;  # rare but possible
+  }
+  
+  my $and;
+  # junk
+  $and = '' if  $chunks[-1][1] == 0  and  $chunks[-1][0] < 100;
+   # The special 'and' that shows up in like "one thousand and eight"
+   # and "two billion and fifteen", but not "one thousand [*and] five hundred"
+   # or "one million, [*and] nine"
+
+  _chunks2tr( \@chunks );
+
+  $chunks[-2] .= " " if $and and @chunks > 1;
+  return "$chunks[0] $chunks[1]" if @chunks == 2;
+   # Avoid having a comma if just two units
+  return join ", ", @chunks;
+}
+
+
+sub _chunks2tr {
+  my $chunks = $_[0];
+  return unless @$chunks;
+  my @out;
+  foreach my $c (@$chunks) {
+    push @out,   $c = _groupify( _int2tr( $c->[0] ),  $c->[1] ,$c->[0])  if $c->[0];
+  }
+  @$chunks = @out;
+  return;
+}
+
+sub _groupify {
+  # turn ("seventeen", 3) => "seventeen billion"
+  my($basic, $multnum, $raw) = @_;
+  return  $basic unless $multnum;  # the first group is unitless
+  DEBUG > 2 and print "  Groupifying $basic x $multnum mults\n";
+  return "$basic $Mult{$multnum}"  if  $Mult{$multnum};
+   # Otherwise it must be huuuuuge, so fake it with scientific notation
+  return "$basic " . "çarpı on üzeri " . num2tr($raw * 3);
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# Because I can never remember this:
+#
+#  3.1E8
+#  ^^^   is called the "mantissa"
+#      ^ is called the "exponent"
+#         (the implicit "10" is the "base" a/k/a "radix")
+
+sub _e2tr {
+  my $x = $_[0];
+
+  my($m, $e);
+  if( $x =~
+    m<
+      ^(
+        [-+]?  # leading sign
+        (?:
+          [\d,]+  |  [\d,]*\.\d+  # number
+        )
+       )
+      [eE]
+      (-?\d+)   # mantissa, has to be an integer
+      $
+    >x
+  ) {
+    ($m, $e) = ($1, $2);
+    DEBUG and print "  Scientific notation: [$x] => $m E $e\n";
+    $e += 0;
+    return num2tr($m) . ' çarpı on üzeri ' . num2tr($e);
+  } else {
+    DEBUG and print "  Okay, $x isn't in exponential notation\n";
+    return undef;
+  }
+}
+
+#==========================================================================
+
+1;
+
+__END__
+
+#1 milyon    1.000.000
+#1 milyar    1.000.000.000
+#1 trilyon   1.000.000.000.000
+#1 katrilyon 1.000.000.000.000.000
+#1 kentilyon 1.000.000.000.000.000.000
+#1 seksilyon 1.000.000.000.000.000.000.000
+#1 septilyon 1.000.000.000.000.000.000.000.000
+#1 oktilyon  1.000.000.000.000.000.000.000.000.000
+#1 nobilyon  1.000.000.000.000.000.000.000.000.000.000
+#1 desilyon  1.000.000.000.000.000.000.000.000.000.000.000
+
+=pod
+
+=encoding utf8
+
+=head1 NAME
+
+Lingua::TR::Numbers - Converts numbers into Turkish text.
+
+=head1 SYNOPSIS
+
+   use Lingua::TR::Numbers qw(num2tr num2tr_ordinal);
+   
+   my $x = 234;
+   my $y = 54;
+   print "Bugün yapman gereken ", num2tr($x), " tane işin var!\n";
+   print "Yarın annemin ", num2tr_ordinal($y), " yaşgününü kutlayacağız.\n";
+
+prints:
+
+   Bugün yapman gereken iki yüz otuz dört tane işin var!
+   Yarın annemin elli dördüncü yaşgününü kutlayacağız.
+
+=head1 DESCRIPTION
+
+Lingua::TR::Numbers turns numbers into Turkish text. It exports
+(upon request) two functions, C<num2tr> and C<num2tr_ordinal>. 
+Each takes a scalar value and returns a scalar value. The return 
+value is the Turkish text expressing that number; or if what you 
+provided wasn't a number, then they return undef.
+
+This module can handle integers like "12" or "-3" and real numbers like "53.19".
+
+This module also understands exponential notation -- it turns "4E9" into
+"dört çarpı 10 üzeri dokuz"). And it even turns "INF", "-INF", "NaN"
+into "sonsuz", "eksi sonsuz" and "sayı-değil" respectively.
+
+Any commas in the input numbers are ignored.
+
+=head1 FUNCTIONS
+
+You can import these one by one or use the special C<:all> tag:
+
+   use Lingua::TR::Numbers qw(num2tr num2tr_ordinal);
+
+or
+
+   use Lingua::TR::Numbers qw(:all);
+
+=head2 num2tr
+
+Converts the supplied number into Turkish text.
+
+=head2 num2tr_ordinal
+
+Similar to C<num2tr>, but returns ordinal versions .
+
+=head1 LIMIT
+
+This module supports any numbers upto 999 decillion (999*10**33). Any further 
+range is currently not in commnon use and is not implemented.
+
+=head1 SEE ALSO
+
+L<Lingua::EN::Numbers>. L<http://www.radikal.com.tr/haber.php?haberno=66427>
+L<http://en.wikipedia.org/wiki/Names_of_large_numbers>.
+
+See C<NumbersTR.pod> (bundled with this distribution) for the Turkish translation of
+this documentation.
+
+=head1 CAVEATS
+
+This module' s source file is UTF-8 encoded (without a BOM) and it returns UTF-8
+values whenever possible.
+
+Currently, the module won't work with any Perl older than 5.6.
+
+=head1 AUTHOR
+
+Burak Gürsoy, E<lt>burakE<64>cpan.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2006-2008 Burak Gürsoy. All rights reserved.
+
+This module is based on and includes modified code 
+portions of Sean M. Burke's Lingua::EN::Numbers.
+
+Lingua::EN::Numbers is Copyright (c) 2005, Sean M. Burke.
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify 
+it under the same terms as Perl itself, either Perl version 5.8.8 or, 
+at your option, any later version of Perl 5 you may have available.
+
+=cut

lib/Lingua/TR/NumbersTR.pod

+=pod
+
+=encoding utf8
+
+=head1 AD
+
+Lingua::TR::Numbers - Sayıları Türkçe okunuşlarına çevirir.
+
+=head1 ÖZET
+
+   use Lingua::TR::Numbers qw(num2tr num2tr_ordinal);
+   
+   my $x = 234;
+   my $y = 54;
+   print "Bugün yapman gereken ", num2tr($x), " tane işin var!\n";
+   print "Yarın annemin ", num2tr_ordinal($y), " yaşgününü kutlayacağız.\n";
+
+çıktısı:
+
+   Bugün yapman gereken iki yüz otuz dört tane işin var!
+   Yarın annemin elli dördüncü yaşgününü kutlayacağız.
+
+=head1 TANIM
+
+Lingua::TR::Numbers, sayıları türkçe okunuşlarına çevirir. (İstenmesi halinde)
+adboşluğunuza iki adet fonksiyon ihraceder:  C<num2tr> ve C<num2tr_ordinal>.
+Bu fonksiyonlardan dönen değer; belirtilen sayının türkçe okunuşu
+veya belirtilen değerin sayı olmaması durumunda C<undef> tir.
+
+Modül, "12" veya "-3" gibi tam sayılar ile "53.19" gibi gerçel sayılar
+üzerinde çalışabilir.
+
+Modülü, üstel gösterimi de anlayabilir. "4E9" değeri, "dört çarpı 10 üzeri dokuz"
+değerine dönüştürülecektir. Ayrıca, "INF", "-INF", "NaN" değerleride sırasıyla:
+"sonsuz", "negatif sonsuz" and "sayı-değil" değerlerine dönüştürülür.
+
+Girilen verideki herhangi bir virgül işareti yok sayılacaktır.
+
+=head1 FONKSİYONLAR
+
+Modülün fonksiyonlarını teker teker veya özel C<:all> etiketi ile,
+ithal edebilirsiniz:
+
+   use Lingua::TR::Numbers qw(num2tr num2tr_ordinal);
+
+veya
+
+   use Lingua::TR::Numbers qw(:all);
+
+=head2 num2tr
+
+Verilen sayıyı Türkçe yazıya dönüştürür.
+
+=head2 num2tr_ordinal
+
+C<num2tr> ile benzerdir, ancak sayıyı sıralı olarak dönüştürür.
+
+=head1 SINIRLAMA
+
+Modülü desteklediği en yüksek sayı değeri 999 desilyondur (999*10**33).
+Bundan daha yüksek haneler, sık kullanılmadığı için, modüle dahil edilmemiştir.
+
+=head1 DİĞER BELGELER
+
+L<Lingua::EN::Numbers>. L<http://www.radikal.com.tr/haber.php?haberno=66427>
+L<http://en.wikipedia.org/wiki/Names_of_large_numbers>
+
+=head1 UYARI
+
+Bu modülün kaynak dosyası UTF-8 olarak kodlanmıştır (BOM olmadan) ve mümkün 
+olduğu taktirde, dönen değerler UTF-8 kodludur. 
+
+Şu an için modül, 5.6 sürümünden daha yaşlı Perl sürümleriyle çalışmamaktadır.
+
+=head1 YAZAR
+
+Burak Gürsoy, E<lt>burakE<64>cpan.orgE<gt>
+
+=head1 TELİF
+
+Telif hakkı: (c) 2006-2008 Burak Gürsoy. Tüm hakları saklıdır.
+
+Bu modül, Sean M. Burke' ün Lingua::EN::Numbers
+modülü üzerine inşa edilmiştir, ve ilgili modülün
+değiştirilmiş kod parçacıklarını içermektedir.
+
+Lingua::EN::Numbers telif hakkı: (c) 2005, Sean M. Burke.
+
+=head1 LİSANS
+
+Bu kütüphane ücretsiz bir yazılımdır; Perl sürüm 5.8.8 veya istediğiniz
+taktirde, daha yüksek bir Perl 5 sürümünün lisansına bağlı olarak; Perl ile
+aynı lisans altında tekrar dağıtabilir ve/veya değiştirebilirsiniz.
+
+=cut
+#!/usr/bin/env perl -w
+use strict;
+use Test::More;
+
+my @errors;
+eval { require Test::Pod; };
+push @errors, "Test::Pod is required for testing POD"   if $@;
+eval { require Pod::Simple; };
+push @errors, "Pod::Simple is required for testing POD" if $@;
+
+if ( not @errors ) {
+   my $tpv = Test::Pod->VERSION;
+   my $psv = Pod::Simple->VERSION;
+
+   if ( $tpv < 1.26 ) {
+      push @errors, "Upgrade Test::Pod to 1.26 to run this test. "
+                   ."Detected version is: $tpv";
+   }
+
+   if ( $psv < 3.05 ) {
+      push @errors, "Upgrade Pod::Simple to 3.05 to run this test. "
+                   ."Detected version is: $psv";
+   }
+}
+
+if ( $] < 5.008 ) {
+   # Any older perl does not have Encode.pm. Thus, Pod::Simple
+   # can not handle utf8 encoding and it will die, the tests
+   # will fail. This skip part, skips an inevitable failure.
+   push @errors, "'=encoding utf8' directives in Pods don't work "
+                ."with legacy perl.";
+}
+
+if ( @errors ) {
+   plan skip_all => "Errors detected: @errors";
+}
+else {
+   Test::Pod::all_pod_files_ok();
+}

t/02-pod-coverage.t

+#!/usr/bin/env perl -w
+use strict;
+use Test::More;
+
+eval {require Test::Pod::Coverage;};
+if($@) {
+   plan skip_all => "Test::Pod::Coverage required for testing pod coverage";
+} else {
+   plan tests => 1;
+   Test::Pod::Coverage::pod_coverage_ok('Lingua::TR::Numbers', {trustme => [qw/DEBUG/]});
+}

t/20_main_integers.t

+use 5.006;
+use strict;
+use utf8;
+use Test;
+
+BEGIN { plan tests => 18 }
+
+use Lingua::TR::Numbers qw(num2tr);
+ok 1;
+
+print "# Using Lingua::TR::Numbers v$Lingua::TR::Numbers::VERSION\n";
+
+ok num2tr(  0    ), "sıfır";
+ok num2tr( '0'   ), "sıfır";
+ok num2tr('-0'   ), "eksi sıfır";
+ok num2tr( '0.0' ), "sıfır nokta sıfır";
+ok num2tr(  '.0' ), "nokta sıfır";
+ok num2tr(  1    ), "bir";
+ok num2tr(  2    ), "iki";
+ok num2tr(  3    ), "üç";
+ok num2tr(  4    ), "dört";
+ok num2tr( 40    ), "kırk";
+ok num2tr( 42    ), "kırk iki";
+
+ok num2tr(400    ), "dört yüz";
+ok num2tr( '0.1' ), "sıfır nokta bir";
+ok num2tr(  '.1' ), "nokta bir";
+ok num2tr(  '.01'), "nokta sıfır bir";
+
+
+ok num2tr('4003' ), "dört bin üç";
+
+print "# TAMAM, bitti.\n";
+ok 1;
+use 5.006;
+use strict;
+use utf8;
+use Test;
+BEGIN { plan tests => 58 }
+
+use Lingua::TR::Numbers qw(num2tr num2tr_ordinal);
+print "# Using Lingua::TR::Numbers v$Lingua::TR::Numbers::VERSION\n";
+ok 1;
+
+sub N ($) { num2tr(        $_[0]) }
+sub O ($) { num2tr_ordinal($_[0]) }
+
+ok N   0, 'sıfır';
+ok N   1, 'bir';
+ok N   2, 'iki';
+ok N   3, 'üç';
+ok N   4, 'dört';
+ok N   5, 'beş';
+ok N   6, 'altı';
+ok N   7, 'yedi';
+ok N   8, 'sekiz';
+ok N   9, 'dokuz';
+ok N  10, 'on';
+ok N  11, 'on bir';
+ok N  12, 'on iki';
+ok N  13, 'on üç';
+ok N  14, 'on dört';
+ok N  15, 'on beş';
+ok N  16, 'on altı';
+ok N  17, 'on yedi';
+ok N  18, 'on sekiz';
+ok N  19, 'on dokuz';
+ok N  20, 'yirmi';
+ok N  21, 'yirmi bir';
+ok N  22, 'yirmi iki';
+ok N  23, 'yirmi üç';
+ok N  24, 'yirmi dört';
+ok N  25, 'yirmi beş';
+ok N  26, 'yirmi altı';
+ok N  27, 'yirmi yedi';
+ok N  28, 'yirmi sekiz';
+ok N  29, 'yirmi dokuz';
+ok N  30, 'otuz';
+ok N  99, 'doksan dokuz';
+
+ok N  103, 'yüz üç';
+ok N  139, 'yüz otuz dokuz';
+
+ok num2tr_ordinal(133), 'yüz otuz üçüncü';
+
+ok N '3.14159'  , 'üç nokta bir dört bir beş dokuz';
+ok N '-123'     , 'eksi yüz yirmi üç';
+ok N '+123'     , 'artı yüz yirmi üç';
+ok N '+123'     , 'artı yüz yirmi üç';
+
+ok N '0.0001'   , 'sıfır nokta sıfır sıfır sıfır bir';
+ok N '-14.000'  , 'eksi on dört nokta sıfır sıfır sıfır';
+
+# and maybe even:
+ok N '-1.53e34' , 'eksi bir nokta beş üç çarpı on üzeri otuz dört';
+ok N '-1.53e-34', 'eksi bir nokta beş üç çarpı on üzeri eksi otuz dört';
+ok N '+19e009'  , 'artı on dokuz çarpı on üzeri dokuz';
+
+ok N "263415"   , "iki yüz altmış üç bin dört yüz on beş";
+
+ok N  "5001"    , "beş bin bir";
+ok N "-5001"    , "eksi beş bin bir";
+ok N "+5001"    , "artı beş bin bir";
+
+ok !defined N "abc";
+ok !defined N "00.0.00.00.0.00.0.0";
+ok          N "1,000,000" , "bir milyon";
+ok          N "1,0,00,000", "bir milyon";
+ok !defined N "5 bananas";
+ok !defined N "x5x";
+ok !defined N "";
+ok !defined N undef;
+
+print "# TAMAM, bitti.\n";
+ok 1;