2013年5月30日 星期四

【轉貼備份】JAVA String.format 方法使用介紹


[轉貼]JAVA String.format 方法使用介紹
在JDK1.5中,String類增加了一個非常有用的靜態函數format(String format, Objece... argues),可以將各類數據格式化為字符串並輸出。其中format參數指定了輸出的格式,是最複雜也是最難掌握的一點,而argues則是一系列等 待被格式化的對象。該函數對c語言中printf函數的用法進行了一定的模仿,因此有c語言基礎的人學起來會輕鬆許多。下面我們著重討論一下format 參數的格式及含義。
format參數中可以包含不需要轉化的字符串,這些字符串是你寫什麼,最終就輸出什麼。同時還包含一些特殊格式的內容,來指定將哪個對象來轉換,以及轉 換成什麼形式。這種特殊的格式通通以%index$開頭,index從1開始取值,表示將第index個參數拿進來進行格式化。這一點比c語言要強一點, c語言只能按照參數的順序依次格式化,而java可以選擇第n個參數來格式化。由於該函數可以對任意一個對像進行格式化,不同的對象適用的參數也不同,因 此我們下面分類來討論。

1.對整數進行格式化:

%[index$][標識][最小寬度]轉換方式

我們可以看到,格式化字符串由4部分組成,其中%[index$]的含義我們上面已經講過,[最小寬度]的含義也很好理解,就是最終該整數轉化的字符串最少包含多少位數字。我們來看看剩下2個部分的含義吧:
標識:

'-'    在最小寬度內左對齊,不可以與「用0填充」同時使用
'#' 只適用於8進制和16進制,8進制時在結果前面增加一個0,16進制時在結果前面增加0x
'+' 結果總是包括一個符號(一般情況下只適用於10進制,若對像為BigInteger才可以用於8進制和16進制)
' ' 正值前加空格,負值前加負號(一般情況下只適用於10進制,若對像為BigInteger才可以用於8進制和16進制)
'0' 結果將用零來填充
',' 只適用於10進制,每3位數字之間用「,」分隔
'(' 若參數是負數,則結果中不添加負號而是用圓括號把數字括起來(同『+』具有同樣的限制)


轉換方式:
d-十進制 o-八進制 x或X-十六進制
上面的說明過於枯燥,我們來看幾個具體的例子。
需要特別注意的一點是:大部分標識字符可以同時使用。

        System.out.println(String.format("%1$,09d", -3123));
System.out.println(String.format("%1$9d", -31));
System.out.println(String.format("%1$-9d", -31));
System.out.println(String.format("%1$(9d", -31));
System.out.println(String.format("%1$#9x", 5689));

//結果為:
//-0003,123
// -31
//-31
// (31)
// 0x1639


2.對浮點數進行格式化:

%[index$][標識][最少寬度][.精度]轉換方式

我們可以看到,浮點數的轉換多了一個「精度」選項,可以控制小數點後面的位數。
標識:

'-'    在最小寬度內左對齊,不可以與「用0填充」同時使用
'+' 結果總是包括一個符號
' ' 正值前加空格,負值前加負號
'0' 結果將用零來填充
',' 每3位數字之間用「,」分隔(只適用於fgG的轉換)
'(' 若參數是負數,則結果中不添加負號而是用圓括號把數字括起來(只適用於eEfgG的轉換)


轉換方式:

'e', 'E'  --  結果被格式化為用計算機科學記數法表示的十進制數
'f' -- 結果被格式化為十進制普通表示方式
'g', 'G' -- 根據具體情況,自動選擇用普通表示方式還是科學計數法方式
'a', 'A' -- 結果被格式化為帶有效位數和指數的十六進制浮點數


3.對字符進行格式化:
對字符進行格式化是非常簡單的,c表示字符,標識中'-'表示左對齊,其他就沒什麼了。

4.對百分比符號進行格式化:
看了上面的說明,大家會發現百分比符號「%」是特殊格式的一個前綴。那麼我們要輸入一個百分比符號該怎麼辦呢?肯定是需要轉義字符的,但是要注意的是,在這裡轉義字符不是「\」,而是「%」。換句話說,下面這條語句可以輸出一個「12%」:

System.out.println(String.format("%1$d%%", 12));


5.取得平台獨立的行分隔符:
System.getProperty("line.separator")可以取得平台獨立的行分隔符,但是用在format中間未免顯得過於煩瑣了。於是format函數自帶了一個平台獨立的行分隔符那就是String.format("%n")。

6.對日期類型進行格式化:
以下日期和時間轉換的後綴字符是為 't' 和 'T' 轉換定義的。這些類型相似於但不完全等同於那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉換類型是為了訪問特定於 Java 的功能(如將 'L' 用作秒中的毫秒)。

以下轉換字符用來格式化時間:

'H'     24 小時制的小時,被格式化為必要時帶前導零的兩位數,即 00 - 23。
'I' 12 小時制的小時,被格式化為必要時帶前導零的兩位數,即 01 - 12。
'k' 24 小時制的小時,即 0 - 23。
'l' 12 小時制的小時,即 1 - 12。
'M' 小時中的分鐘,被格式化為必要時帶前導零的兩位數,即 00 - 59。
'S' 分鐘中的秒,被格式化為必要時帶前導零的兩位數,即 00 - 60 ("60" 是支持閏秒所需的一個特殊值)。
'L' 秒中的毫秒,被格式化為必要時帶前導零的三位數,即 000 - 999。
'N' 秒中的毫微秒,被格式化為必要時帶前導零的九位數,即 000000000 - 999999999。
'p' 特定於語言環境的 上午或下午 標記以小寫形式表示,例如 "am" 或 "pm"。使用轉換前綴 'T' 可以強行將此輸出轉換為大寫形式。
'z' 相對於 GMT 的 RFC 822 格式的數字時區偏移量,例如 -0800。
'Z' 表示時區縮寫形式的字符串。Formatter 的語言環境將取代參數的語言環境(如果有)。
's' 自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的秒數,即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
'Q' 自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的毫秒數,即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。


以下轉換字符用來格式化日期:

'B'     特定於語言環境的月份全稱,例如 "January" 和 "February"。
'b' 特定於語言環境的月份簡稱,例如 "Jan" 和 "Feb"。
'h' 與 'b' 相同。
'A' 特定於語言環境的星期幾全稱,例如 "Sunday" 和 "Monday"
'a' 特定於語言環境的星期幾簡稱,例如 "Sun" 和 "Mon"
'C' 除以 100 的四位數表示的年份,被格式化為必要時帶前導零的兩位數,即 00 - 99
'Y' 年份,被格式化為必要時帶前導零的四位數(至少),例如,0092 等於格裡高利歷的 92 CE。
'y' 年份的最後兩位數,被格式化為必要時帶前導零的兩位數,即 00 - 99。
'j' 一年中的天數,被格式化為必要時帶前導零的三位數,例如,對於格裡高利歷是 001 - 366。
'm' 月份,被格式化為必要時帶前導零的兩位數,即 01 - 13。
'd' 一個月中的天數,被格式化為必要時帶前導零兩位數,即 01 - 31
'e' 一個月中的天數,被格式化為兩位數,即 1 - 31。


以下轉換字符用於格式化常見的日期/時間組合。

'R'     24 小時制的時間,被格式化為 "%tH:%tM"
'T' 24 小時制的時間,被格式化為 "%tH:%tM:%tS"。
'r' 12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標記 ('%Tp') 的位置可能與語言環境有關。
'D' 日期,被格式化為 "%tm/%td/%ty"。
'F' ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。
'c' 日期和時間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。
原文出處 String.format函数使用方法介绍-华丽的痘痘- CSDN博客

另一篇不錯的介紹 http://blueram.iteye.com/blog/441683

2013年5月28日 星期二

解決 Chrome 更新 flashplay plugin後,youtube 播放有影像無聲音問題

先複製 chrome://plugins/ 到網址列 檢查一下 Adobe Flash Player 是否有兩個

保留這一個
名稱:Shockwave Flash
說明:Shockwave Flash 11.7 r700
版本:11,7,700,202
位置:C:\Windows\SysWOW64\Macromed\Flash\NPSWF32_11_7_700_202.dll
類型:NPAPI

另一個就停用,重新啟動 chrome 應該就可以了

另一個看到個可能是,將其停用
名稱:Shockwave Flash
說明:Shockwave Flash 11.7 r700
版本:11.7.700.203
位置:C:\Users\William\AppData\Local\Google\Chrome\Application\27.0.1453.94\PepperFlash\pepflashplayer.dll
類型:PPAPI (獨立程序)

http://get.adobe.com/tw/flashplayer/?no_redirect 可安裝最新版

照理來說更新之後舊版應該會被取代 不知道甚麼原因結果變成共存 所以才會沒聲音?
停用其中一個就可以了

2013年5月27日 星期一

三套好用的SQLite 圖形化管理工具


工欲善其事,必先利其器,與其一直使用命令列 key in key到掛,
不如找一套好用的工具帶你上天堂!!!增加你的工作效率

(1)SQLiteStudio
個人最常用的一套,使用方式很直覺,最常用的快捷鍵為alt+e
還有F9...真的還蠻方便的,另外還提供方便的介面可同時管理
多個SQLite 資料庫
http://sqlitestudio.pl/



(2)SQLite Database Browser
也是一套蠻好用的圖形管理工具,主要特色為提供多個
不同平台的支援
http://sqlitebrowser.sourceforge.net/


(3)SQLite Administrator
輕量化的管理工具,檔案大小是三者之間最小的
可惜似乎已停止開發
http://sqliteadmin.orbmu2k.de/

2013年5月25日 星期六

Android 禁止螢幕進入休眠和鎖定

最快的方法為
在 setContentView 之前加入下列程式片段

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

setContentView(R.layout.main); 

【參考網址】
http://blog.csdn.net/chenyafei617/article/details/6575621

2013年5月23日 星期四

Google Maps Android API v2 簡易練習

由 Google Android SDK開發範例大全|第3版 範例 修改而來
原本為 v1 版本,手工轉為 v2 版本,參照 Google Map API demo
若開啟後發生res 資源檔發生問題,請執行 clean 即可
Layout 佈局:


執行畫面:

原始檔案:
https://dl.dropboxusercontent.com/u/15526319/Android/testGoogleMap003.zip

2013年5月18日 星期六

Google Maps Android API v2 官方 Demo 的使用步驟

參考官方文件
https://developers.google.com/maps/documentation/android/intro?hl=zh-TW#sample_code
裡面提到

  1. Select File > Import > Android > Existing Android Code Into Workspace and click Next.
  2. Select Browse..., enter /extras/google/google_play_services/libproject/google-play-services_lib, and click Finish.
Once you have installed Google Play services, you can view the sample code, or run the sample app locally. The sample app is an Eclipse project that you can run on your device as follows:
  1. Select File > Import > Android > Existing Android Code Into Workspace and click Next.
  2. Select Browse..., enter /extras/google/google_play_services/samples/maps, and click Finish.
  3. Select Project > Properties, select Java Build Path, and navigate to Libraries.
  4. Select Add External Jars, include the following jar files, and click OK:
    • /extras/android/compatibility/v4/android-support-v4.jar
  5. Add your own Google Maps Android API key.
  6. Select Run > Run to test the sample app.


第一個請要選擇copy到專案目錄

第二個步驟 的第3點 在完成第一步驟後才能正確成功,否則點進去看 Libraies 會顯示錯誤訊息。

其他的請按照 Map Fragment / MapView v2 Quick Start
所指示步驟處理

無法正常執行Google map demo 的解決方式:
簡單說明,在專案中建立libs 的目錄,將 google-play-services.jar
及 android-support-v4.jar 加入,接著將兩個檔案 利用 Build Path 加入
接下來應該不會再出現 java.lang.NoClassDefFoundError: com.example.mapdemo.BasicMapActivity 這樣的錯誤問題

但因為要在手機上測試(發佈),無法使用debug.key產生的 API Acess key 來存取 google map api 要使用,但一般測試仍可使用一般的debug.key,
or
步驟 所產生的app專屬key 來產生 API Acess key 才可正常存取,不會發生問題

在模擬器中使用Google play service
參考

PS.
在發佈軟體時,發生 strings.xml 錯誤的問題解決方式

Avoid Android Lint complains about not-translated string

解決方式之一就是將 google-play-services_lib 當中 values 其他語系的資料刪光光
就可以正常編譯了。
或者是在出問題的 string.xml 描述檔做一些修改
如下面說明
xml version="1.0" encoding="utf-8"?>

xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation" >



這樣一來就沒問題了

中文 Google Map API 教學簡介

2013年5月17日 星期五

使用 Intent 跳到其他的Activity 並搭配 startActivityForResult

MainActivity.java

package com.example.basic_intent;

//使用 Intent 跳到其他的Activity
//並使用 startActivityForResult() 來傳送 requestCode
//並設定 onActivityResult() 來接收過濾 requestCode / resultCode
//並在 MainTwo.java 中設定要丟回來的資料到 Intent 中
//最後 MainActivity.java onActivityResult() 接收資料
//要修改 AndroidManifest.xml
//將 Activity 加到啟動程序中

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

final static int KEY_CHAIN = 333;
final static int KEY_HOLE = 333;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Log.i("生命週期", "1_onCreate");

Button go2 = (Button) this.findViewById(R.id.button1);

go2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(getBaseContext(), MainTwo.class);
//startActivity(intent);
startActivityForResult(intent, KEY_CHAIN);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

Log.i("返回訊息", "回到onActivityResult");

if(requestCode == KEY_CHAIN){
//if(resultCode == RESULT_OK){
if(resultCode == KEY_HOLE){
Log.i("返回訊息", "正常收到KEY_HOLE的資料");
//取回MainTwo 送回來的資料
Log.i("返回訊息", data.getExtras().getString("result"));
}
}
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
//finish();
Log.i("生命週期", "1_onStop");
//Toast.makeText(getBaseContext(), "go2 結束了", Toast.LENGTH_LONG).show();
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i("生命週期", "1_onPause");
}

@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i("生命週期", "1_onRestart");
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("生命週期", "1_onResume");
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i("生命週期", "1_onStart");
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("生命週期", "1_onDestroy");
}
}

MainTwo.java
package com.example.basic_intent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
//import android.widget.Toast;

public class MainTwo extends Activity {

final static int KEY_CHAIN = 333;
final static int KEY_HOLE = 333;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);

Log.i("生命週期", "2_onCreate");

Button go1 = (Button) this.findViewById(R.id.button1);

go1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//也可以只送 resultCode,不送任何資料
//setResult(KEY_HOLE);

Intent intent = new Intent();
//intent.setClass(getBaseContext(), MainActivity.class);
intent.putExtra("result", "我在測試送回去的結果");
//setResult(RESULT_OK,intent);
setResult(KEY_HOLE,intent);
//startActivity(intent);

MainTwo.this.finish();
}
});
}

@Override
protected void onStop() {
super.onStop();
//finish();
Log.i("生命週期", "2_onStop");
//Toast.makeText(getBaseContext(), "go2 結束了", Toast.LENGTH_LONG).show();
}

@Override
protected void onPause() {
super.onPause();
Log.i("生命週期", "2_onPause");
}

@Override
protected void onRestart() {
super.onRestart();
Log.i("生命週期", "2_onRestart");
}

@Override
protected void onResume() {
super.onResume();
Log.i("生命週期", "2_onResume");
}

@Override
protected void onStart() {
super.onStart();
Log.i("生命週期", "2_onStart");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.i("生命週期", "2_onDestroy");
}
}

2013年5月16日 星期四

MySQL指令 mysqldump(匯出資料) 用法說明

資料庫資料匯出(dump) 
範例: 
mysqldump -u test -h 192.168.0.100 -p testdb > alltable.sql 
mysqldump -u test -h 192.168.0.100 -p testdb testtable > alltesttable.sql 
mysqldump -u test -h 192.168.0.100 -d -p testdb testtable > schematesttable.sql 
mysqldump -u test -h 192.168.0.100 -d -p testdb testtable1 testtable2> schemasometable.sql 

資料庫資料匯入 
範例: 
mysql -u test -p testdb < testtable.sql 

參數說明 
>: 表示匯出資料 
<: nbsp="" span="">
-u: mysql使用者 
-h: 連線host IP或Domain Name 
-d: 只需要匯出(dump)Table的結構, 若沒有此參數, 會將Table的結構和資料一併匯出 
-p: 需要密碼, 指令執行後待會會要求輸入 
testdb: 指定要處理的DB名稱 
testtable: 指定要處理的Table名稱 
testtable.sql: 匯入或是匯出Table資料的SQL語法


【來源】
http://forum.liferec.com/viewtopic.php?t=185

修改 MySQL 5.x 預設語系為 utf8 解決中文亂碼問題

解決 MySQL 5.x 資料庫 插入中文資料會變成亂碼的問題
修改 MySQL 安裝目錄中的 my.ini 檔案


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

[client]
default-character-set = utf8

加入上述的設定

接著可下 MySQL 指令 驗證 看看是否都已成為 utf8
mysql> SHOW  VARIABLES  LIKE  '%char%'; 


【參考資料】
http://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf8-in-my-cnf
http://www.aydnw.com/html/database/mysql/4419.html
http://j796160836.pixnet.net/blog/post/26585908-%5Bmysql%5D%E6%9B%B4%E6%94%B9%E9%A0%90%E8%A8%AD%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E7%B7%A8%E7%A2%BC

若不想更改資料庫的設定,可於每次PHP 傳送資料時先設定

//此為臨時的設定,重開MySQL 就會恢復
//可藉由設定 PHP 的 My.ini 來固定設定
//設定使用的字集
mysql_query("set character set 'utf8'");
//設定使用的字集
mysql_query("set names 'utf8'");

【參考資料】
http://fanchie.blogspot.tw/2008/11/mysql-set-names-utf8.html

在 Java 中簡易建立與 MySQL 資料的連線流程

在 Java 中簡易建立與 MySQL 資料的連線流程
註冊 jdbc Driver
設定 Connection
建立 Statment
取得 ResultSet

//初始化 jdbc connector
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con;
//使用DriverManager 工廠類別得到 Conneciton
String jdbcStr ="jdbc:mysql://localhost/student?useUnicode=true&characterEncoding=Big5";
con = DriverManager.getConnection( jdbcStr , "root", password);

//使用 Connection 取得 stmt 的實體
Statement stmt = null;
stmt = con.createStatement();

String sql_all = "select * from mon1;";
ResultSet rs = null;
//取得 select 的結果 resultset
rs = stmt.executeQuery(sql_all);
while(rs.next){
//運用 rs.getXXX(columnName) 將相關資料取出
}
} catch (ClassNotFoundException | SQLException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}

啟用 PHP 中的 MySQL 支援

Apache + PHP + MySQL
如果安裝完上述三樣軟體之後
發現PHP 在使用 mysql? 函數時,顯示無法調用
請檢查 PHP 是否有正常掛載 mysql 相關服務
可以在 .PHP 中叫用  phpinfo();
看是否有啟動相關服務

phpinfo 所顯示訊息




















若無相關訊息,則檢察 php 的安裝目錄底下是否有 php.ini檔案
若無 則可將 php.ini-development / php.ini-production 其中之一變更
附檔名為 php.ini ,並搜尋當中的內容
;extension=php_mbstring.dll
;extension=php_exif.dll      
;extension=php_mysql.dll
;extension=php_mysqli.dll
將其前方的 ; 符號取消
再尋找 ; extension_dir = "ext"
將其更改為 extension_dir = "C:/php/ext/"
其中 C:/php 為您 php 的安裝目錄,請自行依照環境設定
全部修改完後存檔,重新啟動 Apache
再次叫用 php 中的 phpinfo();
觀察是否成功啟用

PS. 啟動 Apache 中 對 PHP 的支援
修改 Apache 的設定檔 httpd.conf
加入

#自訂的PHP模組
LoadModule php5_module "c:/php/php5apache2_2.dll"
AddType application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/php"
存檔後重新啟動,確認Apache是否可正常啟動


[JAVA} Multi Thread Console 程式

共計有三段檔案
go.java

//使用 Thread / Runnable 介面 建立執行緒
//有獨立寫出class 也有直接寫在code 裡面

public class go {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一種寫法 複寫 Thread 中的 run 方法
go2 another = new go2();
another.start();

//第二種寫法 複寫 Runnable 介面中的 run 方法
go3 other_inside = new go3();
Thread other = new Thread(other_inside);
other.start();

//第三種寫法 匿名類別 直接複寫 Runnable 中的 run 方法
Thread four = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(i + ". I kiss You!!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
four.start();

for(int i=0;i<20;i++){
System.out.println(i + ". I hate You!!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
go2.java

public class go2 extends Thread {

@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<20;i++){
System.out.println(i + ". I Love You");
try{
Thread.sleep(2000);
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
}
go3.java

public class go3 implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<20;i++){
System.out.println(i + ". I like You!!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Related Posts Plugin for WordPress, Blogger...