• ベストアンサー

時計で一桁の場合、前に0を付けたいです。

よくあるJavascriptのリアルタイム時計で、 桁が一桁だと13:7 というように格好悪くなってしまいます。そこで13:07と表示するように改造しようとしたのですがsprintfがないようで困っています。 以下駄目だった2つの書き方です。。 mi = 1; // ■mi.length は取れずundifineとなる。。 if(mi.length < 2) mi = "0" + mi; // ■ブラウザリロード時に001のように0がどんどん増える。 if(mi < 10) "0" + mi;

質問者が選んだベストアンサー

  • ベストアンサー
  • lunar16th
  • ベストアンサー率66% (10/15)
回答No.2

こんなのでどうでしょう。 <script language="JavaScript"> var mi = 5; var test //ここが問題の処理!! ※下記解説参照 test = ("00" + mi ).substr( ("00" + mi ).length -2 , 2 ) document.write(test) </script> 私がよくやるゼロ埋め方法なのですが、 「00」+「n桁の文字」 で、 「001」や「0012」等になった文字列から右端二桁だけを取得しています。

natsuyori
質問者

お礼

助かりました。一度増やしてカットするという斬新な発想力に驚きました。しかも凄くシンプルに書けますのですlunar16thさんの方法で今後作成していこうと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

読みやすくする為、結論を先に記述します。 結論は、下記 *2 を *2b とする事です。 [旧:if(mi.length < 2) ] [改:if((mi+"").length < 2) ] 今後の為に、理由を以下に。 ポイントは、データ型の自動変換にあります。 つまり、数字と数値は意識しなければならないと。 mi = 1; <--(*1) mi には数値が設定されました。 よって、型は number となっています。 if(mi.length < 2) <--(*2) lenght は文字列の長さを求めるプロパティですから number オブジェクトには存在しません。 故に undefined となります。 (undefined は if で常に false です。) ここで数値を数字とみて長さを求めたければ if((mi+"").length < 2) <--(*2b) もし mi が数字(文字列)の場合でも影響はありません。 文字列長 0 の文字列 "" を連結するというのは、 自動変換を使った数値を数字(文字列)にする 簡易的な手法です。 mi = "0" + mi; <--(*3) この時点で、右辺の mi は数値ですが、 "0" という数字(文字列)と連結するので文字列として扱われ 左辺 mi は数字(文字列)となります。 故にここでの + は連結演算子(Num1+Val2:文字列の結合。)として働いています。 という事で、案1 の場合は *2 を *2b とするだけでも とりあえずの対応は可能かと。 if(mi < 10) <--(*4) 比較演算子 < の右辺が数値(数値定数)の為、 左辺の変数の数字が比較の時点では数値として扱われます。 1 , "01", "001" いずれも 1 として扱われます。 というか、数値として考えると 1 , "01", "001" いずれも同じというか 見分けられないという事です。 "0" + mi; <--(*5) 上記 *3 のつもりと思われますが。 *5 の記述では、何も起こらないかと。 ここで、 *3 の様な記述でなんとかしたい場合は、 mi = "0" + (mi-0); <--(*3b)or(*5b) mi-0 とする事で強制的に 1 , "01", "001" いずれも 1 として扱い その前方に "0"(数字・文字列の0)を 連結演算子 + で連結すると。 これならば、"0" がどんどん増える事はありません。 数値 0 で減算するというのは、自動変換を使った 数字を数値にする簡易的な手法です。 で、考え方の補足として、データ保持変数と 表示用の編集変数を分けた方が無難かと。 少なくとも、案2 の障害は回避できます。 本当は、保持,作業,表示と分けるのが理想ですが。

natsuyori
質問者

お礼

Javascriptにも型の自動変換があったのですね。知りませんでした。 3つの変数に分ける考え方勉強になります。 私はいままで区別なく使用しておりました【汗】 変数の名前も用途に合わせるとわかりやすそうですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jurarumin
  • ベストアンサー率34% (190/544)
回答No.1

関数を作ってみました。 frmstr : 対象数値   strlen : 埋める桁数 frmstr = 1 strlen = 2 → 01 frmstr = 1 strlen = 3 → 001 となります function ZeroPad(frmstr,strlen) { //指定文字数に見合わない部分に0を埋めて戻します。   var wrk = jsTrim(frmstr);   var lng = wrk.length;   var rtn = "";   //入力文字が空の場合は0埋めしない   if(frmstr == "" ){     return "";   }   //桁が超えていた場合は、取得文字列をそのまま戻す。   if (wrk.length >= strlen){    return wrk;   }   //指定文字数が1未満も取得文字列をそのまま戻す。   if (strlen < 1){    return wrk;   }   for (var i = 0; i < strlen-lng; i++) {    rtn = rtn + "0";   }   return rtn + wrk; }

natsuyori
質問者

お礼

なぜか私の環境ではjsTrimという関数がないのか動作しませんでしたが参考になりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リアルタイム時計をミリ秒まで表示する

    こんにちは。JavaScript初心者です。 JavaScriptを使用して、リアルタイムに時間を表示できますよね。その時計をミリ秒までリアルタイムに表示したいのですが、そのようなサンプルはどのサイトにも置いてないので困っています。 JavaScriptでミリ秒までリアルタイムで表示できる時計の作り方を教えてください。 (例)12:00:00:318    時:分:秒:ミリ秒(3ケタ)

  • PC内蔵時計の時差から表示するHTML時計の作り方

    javascriptとHTMLで「2011/6/15 16:21」と表示できるタグを探しています。 ただし、世界各国の時計を同一のページに表示したいので、以下のように、PCの内蔵時計から時差を求める方式が望ましいです。 日本、内蔵時計±0000 中国、内蔵時計-0100 印国、内蔵時計-0330 以下はその他の必須項目です。 ・サマータイムは考慮する必要はありません。 ・秒は不要です。 ・リアルタイムで時間が更新される必要があります。

  • EXCELのセルへ、デジタル時計を表示できますか?

    excelのセルへリアルタイムの時計を表示することは できるのでしょうか? =now()では入力時の時刻が落ちるだけですよね・・・ HPではjavascriptなどで比較的簡単のようですが エクセルでは難しいのでしょうか??

  • リアルタイムな時間の取得

    ASPでリアルタイムな時間の取得は可能でしょうか? JavaScriptでリアルタイムな時間は取得できたのですが、 JavaScriptはあくまでも各ブラウザのシステムの時間を取得します。 サーバの時間をリアルタイムに各ブラウザに表示させたいのです。 もし何かわかられる方がいらっしゃれば、教えてくださいm(__)m

  • 3桁7SEG時計(PIC16F648A)を作りた…

    3桁7SEG時計(PIC16F648A)を作りたい・・ 3桁時計を作りたいです。 割り込みを使って1秒を作って0:00から9:59まで表示する時計。 私はプログラムの方はあんまり得意ではないので、 ご教授の方よろしくお願いいたします。 以下、必要と思われる情報です。 Device:PIC16F648A マイクロチップテクノロジ コンパイラ:CCS社製PICC MATLAB+CCSコンパイラの環境です。 このハードウェアで0~999までカウント するプログラムは動作しています。 クロック:内臓4MHzです。 ハードウェアポート仕様 PORTA_A1:7SEGLED Cathode Common制御 分(1の位)NPNトランジスタON/OF    A2:7SEGLED Cathode Common制御 分(10の位)NPNトランジスタON/OF    A3:7SEGLED Cathode Common制御 時(1の位)NPNトランジスタON/OF PORTB_B0:7SEGLED Anode 制御 7SEG_a PORTB_B1:7SEGLED Anode 制御  7SEG_b PORTB_B2:7SEGLED Anode 制御  7SEG_c PORTB_B3:7SEGLED Anode 制御  7SEG_d PORTB_B4:7SEGLED Anode 制御  7SEG_e PORTB_B5:7SEGLED Anode 制御  7SEG_f PORTB_B6:7SEGLED Anode 制御  7SEG_g PORTB_B7:7SEGLED Anode 制御  7SEG_h 下記のプログラムは0~600までカウントするプログラムです。 val値でカウントする値を可変できます。 #include <16f648a.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR //内部クロック、WDT,LVPなし #use delay(CLOCK=4000000) //クロック4MHz //#define TIME_OUT unsigned int const LED_SEG[]=      //7SEG表示用テーブル { 0b00111111, /* 0= "0" [1] */ 0b00000110, /* 1= "1" [2] */ 0b01011011, /* 2= "2" [3] */ 0b01001111, /* 3= "3" [4] */ 0b01100110, /* 4= "4" [5] */ 0b01101101, /* 5= "5" [6] */ 0b01111100, /* 6= "6" [7] */ 0b00100111, /* 7= "7" [8] */ 0b01111111, /* 8= "8" [9] */ 0b01101111, /* 9= "9" [10]*/ 0b10000000,   /* 10= "." [11]*/ 0b01000000, /* 11= "-" [12]*/ }; unsigned int ct; //数字の更新間隔 unsigned long val; //表示する数字 unsigned int digit; //表示する桁 unsigned char st[3]; void main(void) { set_tris_a(0b11110000); set_tris_b(0b00000000); digit=0; ct=1; //数字を更新する周期 val=0; //表示する値 while(1) { ct --; if(ct == 0) { //数字の更新 st[2]=val/100; // st[1]=val/10-st[2]*10; //計算 st[0]=val%10; //計算 val++; if(val==600) val=0; ct=20;          //200にすると                          //約1秒間隔の表示に                          //なります。 } if(digit== 2) { //第3桁の表示 output_b(LED_SEG[st[2]]); output_bit(PIN_A3,1);//3桁表示開始 delay_ms (5); //表示期間(ミリ秒) output_bit(PIN_A3,0); //表示を消す delay_us(100); } if(digit== 1) //第2桁の表示 { output_b(LED_SEG[st[1]]); output_bit(PIN_A2,1); delay_ms (5); output_bit(PIN_A2,0); delay_us(100); } if(digit == 0) //第1桁の表示 { output_b(LED_SEG[st[0]]); output_bit(PIN_A1,1); delay_ms (5); output_bit(PIN_A1,0); delay_us(100); } digit ++; if(digit == 3) digit=0;//表示桁を変更 } }

  • JavaScript-世界時計が表示されない

    Dreamweaverで社内サイトの作成をしています。 世界時計を表示したく、Dreamweaverで新規HTML作成→JavaScriptの記述 を行ったところ正しく表示されましたが、 同じソースをコピーして、担当するトップページ(index.html)に貼り付けたところ、時計だけが表示されません。 <使用ブラウザ:IE6.0.2> これは一体何が原因なのでしょうか? ●index.htmlにテンプレートを使用しているから? ●貼り付けようとする位置に問題がある? ●同じページ内に他のJavascriptを使用しているから? 自分なりに色々調べましたが全く見当がつきませんので、 どなたかご存知の方ご教授いただけますでしょうか。 よろしくお願い致します。 世界時計のJavaScriptソースを参考にしたURL http://www.ueda.info.waseda.ac.jp/~gaku/js/how030.html

  • 1回だけリロードしたい

    開いたときに1度だけリロードさせたいのですが、たのページを参考に <script language="javascript"> <!-- if ( location.search.indexOf("1") == -1 ) { setTimeout("_reload()",1000); } function _reload() { location.href = location.href + "?1"; } //--> </script> を入れてみたのですが、リロードはされるものの、いわゆるブラウザの「更新」ボタンとは違うらしく、POSTで送られてきたデータを破棄した状態でリロードされるため、データの取得ができず困っています。 データを保持したままのリロード、つまりブラウザの「更新」ボタンのようなリロードを1度だけさせるにはどうしたらよいか教えてください。

  • 時計表示について(リアルタイム表示と更新日時の表示)

    お世話になります。 現在、以下の2つの時計表示を行おうとしています。  1.現在の時刻のリアルタイム表示   2.更新日時の表示 それぞれ単体では動作するのですが、二つ一緒にするとリアルタイム表示が行われません。どうしてでしょうか?二つの時計表示は無理なんでしょうか?

  • 前スペース補填

    お世話になります。 いろいろ編集パタン等勉強しているつもりですが、 分かりませんで、またここに来てしまいました。 ちょっと前に『前ゼロ』を教えていただきました。 今度は『前スペース』をやりたいのですが、 悩んでいます。 そもそも「printf」と「sprintf」との区別も付きません。 調べた結果では、7桁で前スペースにするには、 $kmk = sprintf("%7d",$kmk); でよいのかなと思います。 そして、$kmkが"123"なら”bbbb123”(bはスペース)となると思うのですが、 画面に表示されたのを見ると、単純に”123”となってしまいます。 以下に実際を表示しましたので、宜しくお願いします。 まず、やっていることは、 cgiで、有効桁だけでセットされているファイルを読み、 画面にリストします。 その際、前スペースにより各項目の位置を揃えたいというモノです。 【ファイル(@kariire)の中身】 47213<>1<>20080503<>3000<>50000<> 38221<>5<>20080508<>25000<>100000<> 18994<>1<>20080506<>2700<>385000<> 【cgiの中身】 foreach $line (@kariire) { local($kmk1,$kmk2,$kmk3,$kmk4,$kmk5) = split(/<>/,$line); $kmk1 = sprintf("%5d",$kmk1); #氏名コード $kmk2 = sprintf("%1d",$kmk2); #借入事由 $kmk3 = sprintf("%8d",$kmk3); #異動日 $kmk4 = sprintf("%6d",$kmk4); #借入額 $kmk5 = sprintf("%7d",$kmk5); #限度額残 &output; } sub output { print <<"STOPP"; $kmk1,$kmk2,$kmk3,$kmk4,$kmk5 <br> STOPP } 以上です、宜しくお願いします。

    • ベストアンサー
    • Perl
  • SafariだけJavascriptが動作しない。

    WEBサイトを作成している者です。Javascriptに関しては初心者です。質問内容は、キャンペーン等の更新頻度が高いサイトを閲覧した時にキャッシュが残っていて前の内容が表示する事例があったため、ブラウザで強制的に更新をかける事になりました。metaタグ内にnonCashを指定しましたが、複数ブラウザでうまく機能する時としない時がありました。Javascriptで何とかならないかと下記内容を試してみましたがMac、Windows両方のSafariだけリロードが停止せず繰り返すためブラウザ動作が重くなり画像もチカチカして使えません。Safariでリロード回数を制御する方法が分かりません。お力を貸してください。よろしくお願いします。 <script type='text/javascript'> window.onload=function(){ var c = 2; //リロード回数 n = document.cookie; if (n > 0){ n = n - 1; } else { n = c; } document.cookie = n; if (n > 0) { setTimeout("location.reload(true)", 1000); } } </script>

このQ&Aのポイント
  • 無期雇用の派遣社員としてIT業界(SES)で働いており、退職を考えています。
  • 退職するにあたって冬のボーナス支給日前であっても特別賞与などを会社に請求することは正当性をもつでしょうか?
  • 退職金についてもこれまでの功績として本来よりも多く支給してもらえるように交渉することは的外れでしょうか?会社が私の稼ぎを取りすぎているのか疑問です。
回答を見る