斎藤です。 ----- Original Message ----- From: "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> Sent: Tuesday, July 08, 2003 2:28 PM Subject: [ruby-dev:20544] Re: [BigDecimal] changing rule of coerce > > |(新規にf_BigDecimal()関数を作ろうかとも思ったのですが、 > こちらを採用したいです(時間がとれれば自分でやりますけど...)。 了解しました。[ruby-dev:20565]でのまつもとさんの解説のおかげで 問題が分かりました。ありがとうございます。 以下、グローバル関数 BigDecimal()を追加したdiffです。 ドキュメントの方も少し付け足してみました。 % ruby -rbigdecimal -e 'd=BigDecimal("1.2345"); puts d' 0.12345E1 % ruby -rbigdecimal -e 'class D<BigDecimal; end; d=D.new("1.23"); p d.class' D となるので、今度こそ合っていると思うのですが…。 Index: bigdecimal.c =================================================================== RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v retrieving revision 1.9 diff -u -r1.9 bigdecimal.c --- bigdecimal.c 1 Jul 2003 14:14:18 -0000 1.9 +++ bigdecimal.c 9 Jul 2003 16:15:07 -0000 @@ -1170,6 +1170,25 @@ } static VALUE +f_BigDecimal(int argc, VALUE *argv, VALUE self) +{ + ENTER(5); + Real *pv; + S_LONG mf; + VALUE nFig; + VALUE iniValue; + + if(rb_scan_args(argc,argv,"11",&iniValue,&nFig)==1) { + mf = 0; + } else { + mf = GetPositiveInt(nFig); + } + SafeStringValue(iniValue); + GUARD_OBJ(pv,VpCreateRbObject(mf, RSTRING(iniValue)->ptr)); + return ToValue(pv); +} + +static VALUE BigDecimal_limit(int argc, VALUE *argv, VALUE self) { VALUE nFig; @@ -1358,6 +1377,9 @@ coerce = rb_intern("coerce"); /* Class and method registration */ rb_cBigDecimal = rb_define_class("BigDecimal",rb_cNumeric); + + /* Global function */ + rb_define_global_function("BigDecimal", f_BigDecimal, -1); /* Class methods */ rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, 2); Index: bigdecimal_en.html =================================================================== RCS file: /src/ruby/ext/bigdecimal/bigdecimal_en.html,v retrieving revision 1.4 diff -u -r1.4 bigdecimal_en.html --- bigdecimal_en.html 27 Jun 2003 04:38:57 -0000 1.4 +++ bigdecimal_en.html 9 Jul 2003 16:15:07 -0000 @@ -99,7 +99,8 @@ where:<BR> s: Initial value string.<BR> n: Maximum number of significant digits of a. n must be a Fixnum object. -If n is omitted or is equal to 0,then the maximum number of significant digits of a is determined from the length of s. +If n is omitted or is equal to 0,then the maximum number of significant digits of a is determined from the length of s.<BR> +In addition, global function BigDecimal(s[,n]) is also defined as an another name. </BLOCKQUOTE> <LI><B>mode</B></LI><BLOCKQUOTE> Index: bigdecimal_ja.html =================================================================== RCS file: /src/ruby/ext/bigdecimal/bigdecimal_ja.html,v retrieving revision 1.4 diff -u -r1.4 bigdecimal_ja.html --- bigdecimal_ja.html 27 Jun 2003 04:38:57 -0000 1.4 +++ bigdecimal_ja.html 9 Jul 2003 16:15:08 -0000 @@ -108,7 +108,8 @@ n は必要な有効桁数(a の最大有効桁数)を整数で指定します。 n が 0 または省略されたときは、n の値は s の有効桁数とみなされます。 s の有効桁数より n が小さいときも n=0 のときと同じです。 -a の最大有効桁数は n より若干大い値が採用されます。 +a の最大有効桁数は n より若干大い値が採用されます。<BR> +また同じ意味を持つグローバル関数として、BigDecimal(s[,n])が定義されていま す。 </BLOCKQUOTE> <LI><B>mode</B></LI><BLOCKQUOTE> --- 斎藤ただし