MATLAB 의 format 명령을 사용하면 명령 창의 출력 표시 형식을 rat, hex, short, long 등으로 변경할 수 있습니다. 공학을 하다보면 숫자를 표현할때 단위에 따라 kilo, giga, mega 등과 같은 단위를 사용하곤 하고 이런 형식으로 바꾸기 위한 방법을 찾아보니 아래 주소에서 괜찮은 코드를 발견해서 소개합니다.

https://kr.mathworks.com/matlabcentral/fileexchange/53886-scientific-prefix-to-number

위 주소에서 다운로드 버튼을 누르면 num2sci.zip 파일을 다운로드 할 수 있고~

num2sci.zip 파일을 압축 해제 한 후에 해당 폴더를 path 에 추가하면 MATLAB 의 아무 디렉토리에서나 사용할 수 있습니다. 폴더를 MATLAB path 에 추가하는 방법은 아래 주소의 글들을 참조하시기 바랍니다.

http://iamaman.tistory.com/1829

http://iamaman.tistory.com/569

http://iamaman.tistory.com/2629

num2sip.m, num2bip.m 함수를 사용할 수 있고 각각 doc num2sip, doc num2bip 이라고 하면 해당 함수에 대한 내용을 보실 수 있습니다.

num2sip 함수는 숫자를 metric prefixed string 으로 변경하는 함수인데 ~ 예를 들어 1000 이라는 숫자를 표현할때는 아시다시피 1 kilo 라고 표현하고 아래와 같이 MATLAB 명령창에 타이핑 하면 됩니다.

>> num2sip(1000)

ans =

1 k

>> num2sip(1e6)

ans =

1 M

num2sip 함수에 대한 설명을 보시면 아시겠지만 아래와 같이 4개 까지 인자를 받을 수 있습니다.

str = num2sip(num, sgf, pfx, trz)

num 은 숫자, sgf 는 표현할 숫자의 자리수, pfx 는 단위의 Full name 으로 할지 Symbol 로 할지 trz 는 자리수를 맞추기 위한 0을 넣을지 말지에 대한 결정입니다.

아래와 같은 예로 사용하시면 됩니다.

>> a=128e6

a =

128000000

>> num2sip(a, [], true, true)

ans =

128.00 mega



Binary 파일에 대해 파싱을 해야 하는 일이 있어서 Python 을 사용하여 binary 파일을 읽고 ~ 해당 값을 hex 형태로 나타내는 코드입니다.

기존에 대부분 텍스트 파일 처리만 주로 했었고 binary 파일을 다룰 일은 별로 없었는데 … 역시 파이썬은 정말 간편한듯 하네요. 너무 좋아~


if __name__ == '__main__':

with open('data.elf', mode='rb') as file:

binaryData = file.read()

binaryDataString = ["{:02x}".format(x) for x in binaryData]

print(binaryDataString)


다행히도 바이너리 파일이 그리 크지 않아서 한번에 읽어들여서 간단하게 처리되는데 아래와 같이 hex 값이 나오네~



Autohotkey 를 사용하여 날짜를 계산하는 경우 이라는 함수 사용 합니다.

메뉴얼은 아래 주소 있으니 보시면 되겠고~

https://autohotkey.com/docs/commands/FormatTime.htm

FormatTime 의 형식은 아래와 같은데~ 대괄호로 묶인 부분은 옵션입니다. 즉, 기본적으로 사용할 때는 안 넣어도 된다는 것입니다.

FormatTime, OutputVar [ , YYYYMMDDHH24MISS, Format]

  • OutputVar 은 FormatTime 의 출력값이고
  • YYYYMMDDHH24MISS 은 입력값입니다.  옵션이므로 안 나오는 경우  현재 컴퓨터에 시간이 설정이 되게 됩니다.  특정 시간을 놓고 싶을때 설정하는 것입니다.
  • Format 은 말 그대로  날짜의 표시형식을  의미합니다.  특정한 형태로 날짜를 표시 하고 싶을 때 사용합니다.

원래 코딩 이라는게  예제를 보면 쉽기 때문에~ 저는 간단하게 예제를 좀 들어 보겠습니다.

일단 가장 단순하게 오늘 날짜로 알아보겠습니다.

아래  코드를 실행해 보시면~

FormatTime, currentDate

msgbox % currentDate

이렇게 현재의 년월일시 요일이 나오는 것을 확인할 수 있습니다.


아래는  날짜의 형식을 바꾸는 예제입니다.

FormatTime, currentDate,, yyyy/MM/dd    ; / 를 구분자로

msgbox % currentDate

FormatTime, currentDate,, yyyy-MM-dd    ; - 를 구분자로

msgbox % currentDate

FormatTime, currentDate,, yyyy.MM.dd   ; . 을 구분자로

msgbox % currentDate

위 코드를 실행해 보면 다음과 같이 결과를 확인할 수 있습니다.


다음으로 날짜를 계산하는 방법에 대해서 간단하게 소개해 보려 합니다.

아래는 오늘로부터 30일 이후의 날짜가 어떻게 되는지를 확인하는 코드입니다.

FormatTime, currentDate,,yyyyMMdd

msgbox % currentDate

currentDate  += 30, days   ; + 30 일

FormatTime, currentDateAfter30,%currentDate%,yyyyMMdd

msgbox % currentDateAfter30

위 코드를 실행해 보면  다음과 같이 오늘 날짜가 나온 후에~

오늘로부터 30일 이후의 날짜가 나오게 됩니다. 오늘은 2018년 03월 24일 인데~ 30일 이후는 4월 23일 이라는 것을 확인할 수 있습니다.


아래와 같은 포스팅도  참조해 보시기 바랍니다.

http://iamaman.tistory.com/1359


오늘은 Date 관련 함수를 하나 소개하려 합니다.

 

보통 Autohotkey 에서 Date 를 표현 할 때는 FormatTime 이라는 함수를 사용하는데요~

 

FormatTime 를 사용하면 YYYYMMDDHH24MISS format 으로 표현된 날짜 및 시간에 대해 다양한 형태로 표현 할 수 있습니다 .

 

하지만 FormatTime 함수에서는 문자 형식으로 표현된 날짜 즉… January, February, March, April, May, June, July, August, September, October, November, December 와 같이 문자로 표현된 날짜에 대해서는 변환 할 수가 없더군요.

 

그래서 좀 찾아보니 저만 불편해 한 게 아니었더군요.

 

아래 포럼에 polyethene 이라는 분이 Date Parser 를 만들어 놨더군요.


 

http://www.autohotkey.com/board/topic/18760-date-parser-convert-any-date-format-to-yyyymmddhh24miss/


 

위 주소에 들어가서~ 아래 그림과 같이 함수를 DateParse() 함수를 다운로드 받을 수 있습니다.


잘 못 찾으실 분들을 위해 파일도 올립니다. 


DateParse.ahk

 


위 그림의 예에서 보는 바와 같이 January 와 같이 달이 문자로 표현되고 시간이 AM, PM 과 같은 형태로 표현되도~ YYYYMMDDHH24MISS 형태로 parsing 할 수 있습니다.

 

저도 다운로드 받아서 아래와 같이 실행해 봤습니다.

 

/*

    Function: DateParse

        Converts almost any date format to a YYYYMMDDHH24MISS value.

 

    Parameters:

        str - a date/time stamp as a string

 

    Returns:

        A valid YYYYMMDDHH24MISS value which can be used by FormatTime, EnvAdd and other time commands.

 

    Example:

> time := DateParse("2:35 PM, 27 November, 2007")

 

    License:

        - Version 1.05 <http://www.autohotkey.net/~polyethene/#dateparse>

        - Dedicated to the public domain (CC0 1.0) <http://creativecommons.org/publicdomain/zero/1.0/>

*/

DateParse(str) {

    static e2 = "i)(?:(\d{1,2}+)[\s\.\-\/,]+)?(\d{1,2}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\w*)[\s\.\-\/,]+(\d{2,4})"

    str := RegExReplace(str, "((?:" . SubStr(e2, 42, 47) . ")\w*)(\s*)(\d{1,2})\b", "$3$2$1", "", 1)

    If RegExMatch(str, "i)^\s*(?:(\d{4})([\s\-:\/])(\d{1,2})\2(\d{1,2}))?"

        . "(?:\s*[T\s](\d{1,2})([\s\-:\/])(\d{1,2})(?:\6(\d{1,2})\s*(?:(Z)|(\+|\-)?"

        . "(\d{1,2})\6(\d{1,2})(?:\6(\d{1,2}))?)?)?)?\s*$", i)

        d3 := i1, d2 := i3, d1 := i4, t1 := i5, t2 := i7, t3 := i8

    Else If !RegExMatch(str, "^\W*(\d{1,2}+)(\d{2})\W*$", t)

        RegExMatch(str, "i)(\d{1,2})\s*:\s*(\d{1,2})(?:\s*(\d{1,2}))?(?:\s*([ap]m))?", t)

            , RegExMatch(str, e2, d)

    f = %A_FormatFloat%

    SetFormat, Float, 02.0

    d := (d3 ? (StrLen(d3) = 2 ? 20 : "") . d3 : A_YYYY)

        . ((d2 := d2 + 0 ? d2 : (InStr(e2, SubStr(d2, 1, 3)) - 40) // 4 + 1.0) > 0

            ? d2 + 0.0 : A_MM) . ((d1 += 0.0) ? d1 : A_DD) . t1

            + (t1 = 12 ? t4 = "am" ? -12.0 : 0.0 : t4 = "am" ? 0.0 : 12.0) . t2 + 0.0 . t3 + 0.0

    SetFormat, Float, %f%

    Return, d

}

 

MsgBox % DateParse("2:35 PM, 27 jan, 2013")

 

이렇게~~ 201301271435 로 파싱이 되네요~ 이렇게 파싱만 되면 FormatTime 함수를 사용해서 얼마든지 변환 할 수 있겠죠~



+ Recent posts