アプリ版:「スタンプのみでお礼する」機能のリリースについて

FLASH8(Win-XP)使用者です。
残り時間の秒数などを小数点以下第1位まで表示させたい場合、通常のやり方、

hyoji.text = Math.floor(jikan*10)/10;

などですと、小数点以下が0の場合は0が表示されません。どうすれば1.0などと表示されるのでしょうか。
お詳しい方、よろしくお願いいたします。

A 回答 (2件)

ご質問を見て,


私も一瞬 「if で分岐?」 もしくは 「型宣言?」 など考えてしまいました。

でも,良いアイデアをパッとは閃かない。
こういう問題でパッ閃かない場合は,
「困った時のJS(JavaScript)頼み」です。

小数点以下の編集
http://www.aichi-iic.or.jp/co/otaya-jouzou/scc/y …
上記ページのJSコードを一部引用し,その考え方を使い,
質問されている ActionScript に当てはめると次のようになります(ASもJSもほぼ同じですが)。

---コピペ可-------------------------------
// 変数の宣言(なくても良いです)
var ss1, ss2, jikan;

// 変数 jikan に 10 を掛ける
ss2 = Math.floor(jikan*10);

// 小数点以下第1位を算出
ss1 = ss2-Math.floor(ss2/10)*10;

// 整数部分と少数部分の間に "." を入れて表示
hyoji.text = Math.floor(ss2/10)+"."+ss1;
---------------------------------------

そう言われればそうですね。簡単な話でした。

JS の方が歴史も古く,人口も多いので,参考になるサイトなどがかなりあります。
それに JS なら,そのままコピペで使える場合もあります σ(^_^;) 。

検索例 ↓

参考URL:http://www.google.com/search?hl=ja&q=JavaScript+ …
    • good
    • 0
この回答へのお礼

おお!これはシンプルでいいですね。
お恥ずかしながらJavaScriptは全くわかりませんがActionScriptに似ていると聞いて安心しました。
使わせていただきます。
ありがとうございました。

お礼日時:2006/07/04 03:54

Math.floor は小数点以下を切り捨て、整数にするメソッドです。


似たようなもので Math クラスの ceil や round というのもありますが、小数点以下を切り上げ、もしくは四捨五入にするだけの違いです。
いずれも結果を整数で返すメソッドですから、小数点以下第1位を残すためには使えません。


ActionScript では浮動小数点という方式を採用しています。
この方式の性質上、小数点以下第○位以降を切り捨てるといった算術演算はまず無理だと思います。

そこで発想を変えまして、算術演算ではない方法をあたってみましょう。
String という関数を使うと、数値も文字列として扱えるようになります。
文字列であれば String クラスのメソッドを使い、指定の桁数だけ取り出したり文字を追加したりすることも、簡単にできます。

小数を変換した文字列には、小数点を表すために必ず” . ”(半角のピリオド)が含まれます。
つまり、数値を変換した文字列の中に半角のピリオドが含まれていれば小数、なければ整数です。
小数の場合はピリオドの次の字までを取り出し、整数の場合は文字列にピリオドと 0 を追加してテキストフィールドに出力することで、整数や細かい小数でも小数点以下第1位までに揃えて表示できます。

*******************************

スクリプトにしてみますと、大体、次のようになります。

(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)


 //算術処理
 time = jikan / 10;


 //求めた数値を文字列に変換し、加工する
 time_str = new String( String( time ) );

 //小数の判定
 //変換した文字列にピリオドがあれば小数、なければ整数
 dec_point = time_str.indexOf( "." );

 //小数の場合は、ピリオドの1つ先までの文字をテキストフィールドに出力
 if( dec_point != -1 )
 {
  hyoji.text = time_str.slice( 0 , dec_point + 2 );
 }
 //整数の場合は小数点と0を追加して出力
 else
 {
  hyoji.text = time_str.concat( ".0" );
 }


まず、扱う数値を String 関数で文字列に変換します。
上記のスクリプトではさしあたって変数 jikan の値を 10 で割った値を扱っていますが、この計算に特に意味はありません。
このあたりは作品に合わせて適宜変更してください。

ちなみに、数値などを文字列表現にする String 関数と、文字列を操作するために new 演算子で作成する String クラスは別物です。
前者はグローバル関数と呼ばれるもので、ActionScript で予め用意されていてユーザーが何の定義もしなくても利用できる関数です。
後者は関数ではなく、文字列の処理のために作られたクラスです。
表記が同じで紛らわしいのですが、機能は全く違います。


文字列の中に特定の文字が含まれているかどうかは、String クラスの indexOf メソッドで調べます。
指定した文字があればその位置が、なければ -1 が返ってきます。
上記のスクリプトでは、この探索の結果を変数 dec_point に格納しています。

小数かどうかは、先述の通り、半角のピリオドが含まれているか否かで判断します。
変数 dec_point に -1 が入っているのなら小数点がありませんので、整数ということになります。この場合は、小数点と 0 を文字列に追加して出力します。

小数の場合は、ピリオドとその次の文字までを取り出します。
指定の字数だけ取り出すには、同じく String クラスの slice メソッドを使います。
なぜ dec_point + 1 ではなく + 2 なのかといいますと、slice メソッドの設計上、+ 1 ではピリオドまでしか取り出せないためです。
slice メソッドでの字数の指定については、ヘルプの slice メソッドの作例をご参考になさってください。

 ・Flash ドキュメント:ActionScript 2.0 リファレンスガイド
  String クラス > slice メソッド
  http://livedocs.macromedia.com/flash/8_jp/main/0 …

*******************************

数値を扱うものでちょっと変わった処理は、数値を1桁ずつ取り出そうとすると難しいけれど文字列なら簡単にできるという発想がポイントです。
文字列に変換すると算術演算ではできない細かい芸当も可能で、3桁おきにカンマを打つ表現や1桁ずつ動くアクセスカウンターの作成など、いろいろな作品に応用できます。

ただし、文字列に変換した後は算術演算はできなくなります。
処理した後で算術演算を行う場合は、Number 関数で数値に再度変換してください。
また、文字列の処理はどうしても処理が重いので、リアルタイムで複雑な計算を行う場合は不向きです。
(まあ、ごく普通に使う分にはあまり細かく考えなくても大丈夫です)


浮動小数点には誤差が付き物です。
小数点以下第2位以降を切り捨てて計算した結果、誤差が拡大することもありえます。
高い精度を要求する計算にご利用の際はご注意ください。
    • good
    • 0
この回答へのお礼

そうですか。直接的な方法はActionScriptにはなかったのですね・・ 
今後はこの裏わざを使わせていただきます。
どうもありがとうございました!

お礼日時:2006/07/04 03:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!