[ocaml] prints.sprintf
От: _rasta  
Дата: 02.07.08 11:08
Оценка:
день добрый.

let s = Printf.sprintf "%d" 1;;
let _ = print_endline s;;


работает.

let s = Printf.sprintf ("%" ^ "d") 1;;
let _ = print_endline s;;


ocamlc ./test.ml
File "./test.ml", line 1, characters 23-34:
This expression has type string but is here used with type
('a -> 'b, unit, string) format =
('a -> 'b, unit, string, string, string, string) format6

вопрос: динамически шаблоны задавать нельзя...?

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re: [ocaml] prints.sprintf
От: Vintik_69 Швейцария  
Дата: 02.07.08 11:35
Оценка:
Здравствуйте, _rasta, Вы писали:

_>вопрос: динамически шаблоны задавать нельзя...?


В таком виде нельзя. Можно объединять только корректные шаблоны с помощью (^^), например: printf ("%d " ^^ "%s") 12 "hello"
Re[2]: [ocaml] prints.sprintf
От: _rasta  
Дата: 03.07.08 03:02
Оценка:
Vintik_69 wrote:

> В таком виде нельзя. Можно объединять только корректные шаблоны с помощью

> (^^), например: printf ("%d " ^^ "%s") 12 "hello"

а если мне надо получить что-то вроде "%20s" ?

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re: [ocaml] prints.sprintf
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.07.08 08:33
Оценка:
Здравствуйте, _rasta, Вы писали:

У printf первый параметр — не строка, это нужно для контроля типов. Формат можно получить из строки специальной функцией.
Re[3]: [ocaml] prints.sprintf
От: Vintik_69 Швейцария  
Дата: 03.07.08 14:12
Оценка:
Здравствуйте, _rasta, Вы писали:

_>а если мне надо получить что-то вроде "%20s" ?


Это невозможно. Да и зачем? Если надо выбирать точность представления чисел, то вот:

The integer in a width or precision can also be specified as *, in which case an extra integer argument is taken to specify the corresponding width or precision. This integer argument precedes immediately the argument to print, unless an optional positional specifier is given to indicates which argument to use. For instance, %.*3$f prints a float with as many fractional digits as the value of the third argument.

Re[4]: [ocaml] prints.sprintf
От: _rasta  
Дата: 04.07.08 03:59
Оценка:
Vintik_69 wrote:

> _>а если мне надо получить что-то вроде "%20s" ?


> Это невозможно. Да и зачем? Если надо выбирать точность представления

> чисел

нет, я хочу получить строку длинной в n символов, причем n я вычисляю.
однако жаль...

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re[5]: [ocaml] prints.sprintf
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 04.07.08 08:11
Оценка:
Здравствуйте, _rasta, Вы писали:

_>нет, я хочу получить строку длинной в n символов, причем n я вычисляю.

_>однако жаль...

А format_of_string использовать не получилось?
Re[6]: [ocaml] prints.sprintf
От: Vintik_69 Швейцария  
Дата: 04.07.08 08:51
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>А format_of_string использовать не получилось?


format_of_string не сможет этого сделать, посмотри на ее тип.
Re[5]: [ocaml] prints.sprintf
От: Vintik_69 Швейцария  
Дата: 04.07.08 08:51
Оценка:
Здравствуйте, _rasta, Вы писали:

_>нет, я хочу получить строку длинной в n символов, причем n я вычисляю.

_>однако жаль...

А поподробнее?
Re[6]: [ocaml] prints.sprintf
От: _rasta  
Дата: 04.07.08 09:24
Оценка:
Vintik_69 wrote:

> _>нет, я хочу получить строку длинной в n символов, причем n я вычисляю.

> _>однако жаль...
>
> А поподробнее?

подробнее...?

ну что-т вроде:
(** вот примерно так хочется видеть получение строки *)
(**
  let s =
  let templ = "%" ^ Sys.argv.(1) ^ "s" in
        Printf.sprintf templ Sys.argv.(2);;
*)

(** вот так вот сейчас сделано *)
let spaces =
  (String.make
         ((int_of_string Sys.argv.(1)) - String.length Sys.argv.(2)) ' ')
;;

(** «|» добавил только для того, чтобы наглядно было видно результат :) *)
let s = "|" ^ spaces ^ Sys.argv.(2) ^ "|";
;;

let _ =  print_endline s
;;


--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re[7]: [ocaml] prints.sprintf
От: Vintik_69 Швейцария  
Дата: 04.07.08 09:48
Оценка:
_>
_>(** вот примерно так хочется видеть получение строки *)
_>(**
_>  let s =
_>  let templ = "%" ^ Sys.argv.(1) ^ "s" in
_>        Printf.sprintf templ Sys.argv.(2);;
_>*)
_>


Что мешает сделать так?
Printf.printf "%*s" (int_of_string Sys.argv.(1)) Sys.argv.(2)
Re[8]: [ocaml] prints.sprintf
От: _rasta  
Дата: 04.07.08 10:21
Оценка:
Vintik_69 wrote:

> Что мешает сделать так?

>
> Printf.printf "%*s" (int_of_string Sys.argv.(1)) Sys.argv.(2)
>


о! оно
thanx.

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.